紫雨轩 .Net, DNGuard HVM , .Net VMProtect

DNGuard HVM - Advanced .NET Code Protection Technology

常用链接

统计

积分与排名

友情连接

最新评论

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

在 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);
        }


posted on 2006-07-13 14:28 紫雨轩 .Net 阅读(2906) 评论(17)  编辑 收藏 网摘 所属分类: C# Winform编程

评论

#1楼  2006-07-13 14:40 随心所欲      

不错。
  回复  引用  查看    

#2楼  2006-07-13 15:20 萧寒      

不错;没什么机会用.   回复  引用  查看    

#3楼  2006-07-13 16:22 feiyun0112      

我前段时间写过同样的

C# 动态调用DLL
http://feiyun0112.cnblogs.com/archive/2006/04/21/381552.html
  回复  引用  查看    

#4楼 [楼主] 2006-07-13 17:11 瑞克      

@feiyun0112
看了你的帖子,实现方法基本上是一样的^_^
你的那个需求用dllimport也可以的哦.

用C#编写插件模式的程序时这个方法还是比较有用的,
插件是用c++写的dll, 它们都会导出相同接口和名称的函数.
  回复  引用  查看    

#5楼  2006-07-13 18:52 dudu      

请调整一下摘要的排版。   回复  引用  查看    

#6楼 [楼主] 2006-07-13 19:28 瑞克      

收到,已调整好。   回复  引用  查看    

#7楼  2006-07-13 22:09 edison1024      

还是C++/CLI好。   回复  引用  查看    

#8楼 [楼主] 2006-07-14 09:49 瑞克      

C++/CLI 动态调用dll函数的确是很方便.
真正用来写winform程序,还是 C#和VB.Net用得顺手.
C++/CLI 用来写.Net类库还不错,在网上看到有人直接用C#来包OpenGL,在api的调用上感觉很别扭,如果直接用C++/CLI来包OpenGL,可能会很不错.
  回复  引用  查看    

#9楼  2006-09-15 15:13 SSS[匿名] [未注册用户]

N年前的东西勒还拿出来,呵呵   回复  引用    

#10楼 [楼主] 2006-09-15 16:19 瑞克      

让高手见笑了,请指教 N 等于几?   回复  引用  查看    

#11楼  2006-09-18 18:14 虚拟过客 [未注册用户]

up   回复  引用    

#12楼  2006-09-29 16:38 ddd [未注册用户]

好样的!看了你的好文,我真的觉很激动啊!   回复  引用    

#13楼  2006-09-29 16:44 Wisdom-zh      

不错。
我记得原先我也有这个需求,不知道怎么就糊弄过来了(好像还是1.0的时候)
  回复  引用  查看    

#14楼  2006-10-12 22:31 wawa [未注册用户]

来到这里就说明文章很有吸引里,我看n<1   回复  引用    

#15楼  2007-01-23 13:48 dd [未注册用户]

wwww   回复  引用    

#16楼  2007-07-18 15:27 Aries [未注册用户]

不错,现在正要这个东西呢,谢谢了~~   回复  引用    

#17楼  2007-11-14 14:33 dyh [未注册用户]

请问LZ,我想在.net cf 里使用,该怎么做?
好象不支持Marshal.GetDelegateForFunctionPointer。
而且听说在.netcf3.5也不一定支持。
  回复  引用    


发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: