遇到一个C# .net core里调用C++ dll的案例。
通常情况下,C#调用 C# 库的方式是通过引用加入。或者如果是动态调用,可以用下面的代码:
//先声明dll对象
private Object dllObj;
//再声明 Method
private MethodInfo method;
//调用方法:
Assembly ass = Assembly.LoadFrom("./{dll文件名}");
Type type = ass.GetType("{命名空间}.{dll里的类名}");
dllObj = Activator.CreateInstance(type);
method = type.GetMethod("{类里面的接口名称}");
//执行
String strResult = (String)method.Invoke(dllObj, new Object[] {接口参数 });
如果是调用C++库,既不能直接引入,也不能用上面的代码,调用方式如下:
[DllImport("{dll文件}.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static int Method(IntPtr value);
对于String 或简单类型,直接传递没问题。但是对于回写的参数,需要用到IntPtr类型。大致用到的方法:
1 声明并初始化: IntPtr ptrTemp = Marshal.AllocHGlobal(100);
2 释放空间,对于手动分配的空间,要手动释放:Marshal.FreeHGlobal(ptrTemp);
3 赋值:比如一个简单的数组:byte[] da = {0xFF, 0xAA. 0xBB};
IntPtr ptr = Marshal.AllocHGlobal(da.Length);
Marshal.Copy(da, 0, ptr, da.Length);
4 回写的值转为字符串: Marshal.PtrToStringAnsi(ptrTemp).Trim();