c# 调用 c++ DLL 的各种问题

本文非完全原创,吸取个个大神的精华整理而成,只为了给遇到此问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; 
}



以上方法亲测可用,要深究原理,则自行找方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值