本文非完全原创,吸取个个大神的精华整理而成,只为了给遇到此问http://题的coder一个实在的解决方法。
每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。首先,您需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。
一下例子是本人亲测可用,但没有去研究的很深入,但可以帮助大家快速解决问题
1、首先注意c++和c#之间数据类型转换的问题,我摘录了一些
http://blog.csdn.net/linwenbin1990/article/details/40516177
2、不带参数
c++处声明
extern "C" __declspec(dllexport) void function()
c#处声明
[DllImport(@"QFloatDll.dll")]
public static extern void function();
3、带参数
c++处声明
extern "C" __declspec(dllexport) voidfunction(bool arg)
c#处声明
[DllImport(@"QFloatDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void function(boolarg);
4、c#调用c++带有回调函数参数的函数
这个一定要注意,如果按照常规方式写,在c#回调函数执行成功后会崩溃,这是因为是C#向C++中传递了临时委托对象,显然这种传递不会增加对象的引用数,因此在Release程序中,这些对象经常很快就被回收掉,因此导致程序异常。
c++处声明
//定义函数回调指针
typedef void (CALLBACK *EventDealFun)(int);
//定义回调函数
EventDealFun eventDealFun = NULL;
//定义C语言类型导出事件函数
extern "C" __declspec(dllexport) void SetEventDealFun(EventDealFun fun)
{
eventDealFun = fun;
}
c#处声明
//声明DLL中的回调函数,即事件
[DllImport(@"QFloatDll.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public static extern void SetEventDealFun([MarshalAs(UnmanagedType.FunctionPtr)] CallbackFun pCallbackFun);
[System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)]
public delegate void CallbackFun(int type);
private void eventDeal(int type)
{
int x = type;
}
以上方法亲测可用,要深究原理,则自行找方法。