托管与非托管的交互问题(函数调用)

记录一下免得以后忘记;

交互首先应该要解决数据结构的处理,这个资料较多,不记录了;

1,

托管 调用 非托管(用的较多):

[DllImportAttribute("dll库文件", EntryPoint = "函数", ......非托管函数的调用约定,编码等设置)

extern void demo2();

2,

非托管 调用 托管(一般用于回调):

public class TestDelegateCallback
{
	[DllImport("test.dll", EntryPoint="setAddFunc")]
	static extern void DLL_SetAddFunc(AddDelegate func);
	
	[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
	delegate int AddDelegate(int a, int b);
	
	
	static AddDelegate _addFunc;
	
	public TestDelegateCallback()
	{
		_addFunc = add;
		DLL_SetAddFunc(_addFunc);
	}
	
	
	private static int add(int a, int b)
	{
		return a + b;
	}
}

注意:

1, UnmanagedFunctionPointer    可设置 托管代码中 委托的 调用约定;当然在非托管的回调函数声明中将调用约定设置成非托管中的默认约定也是可以的(大多数时候是stdcall)

2, 参数类型是委托, 要保证在c++中调用时, 委托不能被回收; 我这里用的是static的, 以防止被回收; 实际要不要用static根据回调的场景来决定;

3, 必须有一个委托变量, 这里也就是_addFunc, 因为参数类型是委托, 如果不用一个成员变量, 则在调用DLL_SetAddFunc时会生成一个临时的委托变量, 而调用结束后这个临时的委托变量随时会被回收.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值