在C#中动态调用native dll的导出函数
2010-01-13 12:36
387 查看
在 C++ 中我们能够通过 LoadLibrary, GetProcAddress 来动态调用 dll 的导出函数.
在 C# 中也能够用这样的方式吗?
在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数
Marshal.GetDelegateForFunctionPointer 方法
此方法在 .NET Framework 2.0 版中是新增的。
将非托管函数指针转换为委托。
实例代码如下:
public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);
private static Delegate GetAddress(int dllModule, string functionname, Type t)
{
int addr = GetProcAddress(dllModule, functionname);
if (addr == 0)
return null;
else
return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
}
private void button1_Click(object sender, EventArgs e)
{
int huser32 = 0;
huser32 = LoadLibrary("user32.dll");
MsgBox mymsg = (MsgBox)GetAddress(huser32, "MessageBoxA", typeof(MsgBox));
mymsg(this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64);
FreeLibrary(huser32);
}
在 C# 中也能够用这样的方式吗?
在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数
Marshal.GetDelegateForFunctionPointer 方法
此方法在 .NET Framework 2.0 版中是新增的。
将非托管函数指针转换为委托。
实例代码如下:
public delegate int MsgBox(int hwnd,string msg,string cpp,int ok);
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);
private static Delegate GetAddress(int dllModule, string functionname, Type t)
{
int addr = GetProcAddress(dllModule, functionname);
if (addr == 0)
return null;
else
return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
}
private void button1_Click(object sender, EventArgs e)
{
int huser32 = 0;
huser32 = LoadLibrary("user32.dll");
MsgBox mymsg = (MsgBox)GetAddress(huser32, "MessageBoxA", typeof(MsgBox));
mymsg(this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64);
FreeLibrary(huser32);
}
相关文章推荐
- 在 C# 中动态调用 native dll 的导出函数
- 在 C# 中动态调用 native dll 的导出函数
- C#动态地调用Win32 DLL中导出的函数
- 更方便地动态调用DLL导出函数
- C#调用C++动态链接库之Win32dll(函数)、MFCdll(对话框)
- C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
- C#中调用C++的dll的参数为指针类型的导出函数
- vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- 动态加载DLL实现不同DLL的相同导出函数调用问题
- C#调用C++ dll导出函数提示找不到指定模块 by:凉游浅笔深画眉 / Net7Cracker
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)
- 动态链接库DLL导出函数的声明和调用
- C#动态调用DLL中的函数
- C#静态调用C++Dll导出函数,并在C++Dll中回调C#函数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
- C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
- DLL导出函数方法以及动态调用
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?