C# DLLImport的理解
2012-06-19 10:47
330 查看
--------------------------------------------------------------------------------------------
先不考虑概念,简单的说就是调用dll中的某个方法。以例子说明。
创建一个form,在其上添加按钮。按钮的点击事件为button1_Click(object sender, EventArgs e)。
//struct 收集系统情况
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
public uint dwOemId;
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//获取系统信息
[DllImport("kernel32")]
static extern void GetSystemInfo(ref SYSTEM_INFO pSI);
private void button1_Click(object sender, EventArgs e)
{
SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);
}
}
说明:
1.点击按钮的时候会发现pSI的值已经发生了变化,里面包含系统信息。
2.SYSTEM_INFO为自定义的结构体,但结构体的参数个数和参数类型要与GetSystemInfo()方法的一致。
3.DllImport的方法的必须写成static extern ,可以修饰为public等。
-------------------------------------------------------------------------------------------
根据上面的调用方式,我们可以同样方式调用自定义的dll吗?
首先创建一个工程Import,并有Class1
namespace Import
{
public class Class1
{
public static string ImportMeth(string str)
{
return "you are success!";
}
}
}
然后以同样方式调用,
//自定义的dll
[DllImport("Import")]
public static extern string ImportMeth(string a);
在button1_Click(object sender, EventArgs e)里追加以下代码:
string strRet = ImportMeth("123");
运行后发现报错"Unable to find an entry point named 'ImportMeth' in DLL 'Import'.":"",
试着把dll引入到工程的参照中,一样报错。
最终查出来,原来DLLImport 用于托管程序调符合DLL规范的非托管程序动态类库.如果是调用托管程序类库,直接引用就行了。
所以我们不需要也不能DLLImport,而应该添加using Import;
string strRet = Class1.ImportMeth("123");
这样就可以得到结果“you are success!”了。
先不考虑概念,简单的说就是调用dll中的某个方法。以例子说明。
创建一个form,在其上添加按钮。按钮的点击事件为button1_Click(object sender, EventArgs e)。
//struct 收集系统情况
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
public uint dwOemId;
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//获取系统信息
[DllImport("kernel32")]
static extern void GetSystemInfo(ref SYSTEM_INFO pSI);
private void button1_Click(object sender, EventArgs e)
{
SYSTEM_INFO pSI = new SYSTEM_INFO();
GetSystemInfo(ref pSI);
}
}
说明:
1.点击按钮的时候会发现pSI的值已经发生了变化,里面包含系统信息。
2.SYSTEM_INFO为自定义的结构体,但结构体的参数个数和参数类型要与GetSystemInfo()方法的一致。
3.DllImport的方法的必须写成static extern ,可以修饰为public等。
-------------------------------------------------------------------------------------------
根据上面的调用方式,我们可以同样方式调用自定义的dll吗?
首先创建一个工程Import,并有Class1
namespace Import
{
public class Class1
{
public static string ImportMeth(string str)
{
return "you are success!";
}
}
}
然后以同样方式调用,
//自定义的dll
[DllImport("Import")]
public static extern string ImportMeth(string a);
在button1_Click(object sender, EventArgs e)里追加以下代码:
string strRet = ImportMeth("123");
运行后发现报错"Unable to find an entry point named 'ImportMeth' in DLL 'Import'.":"",
试着把dll引入到工程的参照中,一样报错。
最终查出来,原来DLLImport 用于托管程序调符合DLL规范的非托管程序动态类库.如果是调用托管程序类库,直接引用就行了。
所以我们不需要也不能DLLImport,而应该添加using Import;
string strRet = Class1.ImportMeth("123");
这样就可以得到结果“you are success!”了。
相关文章推荐
- C# 委托理解
- 帮助理解c#中委托+事件的一个例子
- C#中通过DllImport使用 Win32 API(引)
- 对c#中abstract class、virtual、interface的理解
- 【转】[C# 基础知识系列]专题七:泛型深入理解(一)
- (zz)从callback的角度来理解.NET/C# 中的 委托 (delegate)与 事件 (event)
- c#中 DllImport用法汇总
- c# 逆变 协变的理解
- 【C#】理解Lambda表达式
- 深入理解C#---2.事件?委托?傻傻分不清楚
- C#中的泛型介绍和理解
- C#(.net)中的DllImport
- C# 理解泛型
- 理解C#值类型与引用类型
- C# DllImport用法和路径问题
- [学习笔记]C#(.net)中的DllImport 用法
- C# 中万物皆对象的理解
- 理解 __declspec(dllexport)和__declspec(dllimport)
- C# DllImport的用法
- 正确理解 C# 中的 ref 关键字