在C#中,你不需要使用函数指针,同时C#的DLL也非传统意义上的DLL了,如果你需要调用WIN API,你可以使用Interop, 下面是调用API的MessageBox函数的代码片断,你可以试试:using System.Runtime.InteropService //加上名空间
.......//这里是你要使用的API 函数[DllImport("User32.dll")] //可以是你要调用的DLL
public static extern int MessageBox(int hParent,string message,string caption, int type);现在你可以在你的程序中调用这个MessageBox就象它是C#写的一样。
.......//这里是你要使用的API 函数[DllImport("User32.dll")] //可以是你要调用的DLL
public static extern int MessageBox(int hParent,string message,string caption, int type);现在你可以在你的程序中调用这个MessageBox就象它是C#写的一样。
解决方案 »
- 智能设备 对话框
- 求助, 如果用sendmessage 发送以下消息,应该怎么写?
- 什么情况先需要使用ToString()?
- 想要做一个网上自动答疑系统,请指教
- 大家好,数据表行数问题求解
- 怎样使用WINAPI的函数指针?
- c#的DataGrid中 选中一个网格中的代码 怎样写. 有分给的
- .net反编译,好强大的混淆
- c# 异步 回调读取。让回调函数执行完后返回
- vs2005 调试:源文件与模块生成时的文件不同。仍要让调试器使用它
- 问什么不能运行!!??
- 比较弱的问题:.net环境下,我把一个click事件中的代码修改了,确定已存盘,可运行时居然是修改前的代码??可我用c#eidtor可以修改
我也想过这个问题,因为有时候我们希望能够动态的调用DLL里面的函数,DllImport就不勘用了。这也就是API里面LoadLibrary和GetProcAddress的来由。但不幸的是,答案是几乎办不到:
首先,Method在Managed和unmanaged世界里的转换并不那么直截了当,中间需要一个转换过程(或者叫Marshal),也就是要一段Thunk代码,对动态调用的情形,我们要自己动手,生成这个转换代码(麻烦!!!)。
幸好,.NET倒是提供了一些手法的,Marshal类是个好东东:
Marshal.GetManagedThunkForUnmanagedMethodPtr
可是它的参数和返回值还有麻烦:MethodSignature要你自己从SignatureHelper类里面自己生成,这个还好,返回值居然是一个IntPtr!!!
应该肯定这个IntPtr就是Thunk代码的函数指针,但是MSDN在这个问题上有些含混不清。问题是,我们需要一个函数指针到Delegate的转换!IL里面可以直接使用Calli指令调用函数,但C#里就没办法了。
我卡在了这里,没有进一步的发现。但可以肯定用MSIL写程序直接调用是成功的。所以,有两个可能的解决办法,一使用reflection生成calli指令来调用,二是用MSIL写一个Wrap,通过它来调用。这个没试过,不置可否。
答案再Reflection里,用TypeBuilder.DefinePInvokeMethod!
我到时测试一下,我现在的解决办法是将那个动态调用放在delphi里面做的.