记录一下免得以后忘记;
交互首先应该要解决数据结构的处理,这个资料较多,不记录了;
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时会生成一个临时的委托变量, 而调用结束后这个临时的委托变量随时会被回收.