在 C# 中动态调用 native dll 的导出函数

简介: 在 C++ 中我们能够通过 LoadLibrary,  GetProcAddress 来动态调用 dll 的导出函数.在 C# 中也能够用这样的方式吗?在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数Marshal.GetDelegateForFunctionPointer 方法 此方法在 .NET Framework 2.0 版中是新增的。

在 C++ 中我们能够通过 LoadLibrary,  GetProcAddress 来动态调用 dll 的导出函数.
在 C# 中也能够用这样的方式吗?
在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数
Marshal.GetDelegateForFunctionPointer 方法
此方法在 .NET Framework 2.0 版中是新增的。

将非托管函数指针转换为委托。
实例代码如下:

img_a6339ee3e57d1d52bc7d02b338e15a60.gif public   delegate   int  MsgBox( int  hwnd, string  msg, string  cpp, int  ok);
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        [DllImport(
" Kernel32 " )]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
public   static   extern   int  GetProcAddress( int  handle, String funcname);
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        [DllImport(
" Kernel32 " )]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
public   static   extern   int  LoadLibrary(String funcname);
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        [DllImport(
" Kernel32 " )]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
public   static   extern   int  FreeLibrary( int  handle);
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
private   static  Delegate GetAddress( int  dllModule,  string  functionname, Type t)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif            
int addr = GetProcAddress(dllModule, functionname);
img_33d02437d135341f0800e3d415312ae8.gif            
if (addr == 0
img_33d02437d135341f0800e3d415312ae8.gif                
return null
img_33d02437d135341f0800e3d415312ae8.gif            
else 
img_33d02437d135341f0800e3d415312ae8.gif                
return Marshal.GetDelegateForFunctionPointer(new IntPtr(addr), t);
img_05dd8d549cff04457a6366b0a7c9352a.gif        }

img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif        
private   void  button1_Click( object  sender, EventArgs e)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif        
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif            
int huser32 = 0;
img_33d02437d135341f0800e3d415312ae8.gif            huser32 
= LoadLibrary("user32.dll");         
img_33d02437d135341f0800e3d415312ae8.gif            MsgBox mymsg 
= (MsgBox)GetAddress(huser32, "MessageBoxA"typeof(MsgBox));
img_33d02437d135341f0800e3d415312ae8.gif            mymsg(
this.Handle.ToInt32(), txtmsg.Text, txttitle.Text , 64);
img_33d02437d135341f0800e3d415312ae8.gif            FreeLibrary(huser32);
img_05dd8d549cff04457a6366b0a7c9352a.gif        }

img_a5a467b7b4142b9322af3b2307f9e710.jpg

目录
相关文章
|
8月前
|
C#
C# 解决引用dll,出现dll不可以使用等问题
C# 解决引用dll,出现dll不可以使用等问题
|
JavaScript 前端开发 Java
javascript实现像java、c#之类的sleep暂停的函数功能
javascript实现像java、c#之类的sleep暂停的函数功能
72 0
|
2月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
4月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
3月前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
5月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
103 0
|
5月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
7月前
|
开发框架 .NET 程序员
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
掌握C#语言的精髓:基础知识与实用技能详解(数据类型与变量+ 条件与循环+函数与模块+LINQ+异常+OOP)
41 0
|
7月前
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
245 0
|
8月前
|
XML 缓存 算法
C#非强签名dll搜索顺序
C#非强签名dll搜索顺序