使用正确的数据类型在 CSharp 中加载 C++ dll
Posted
技术标签:
【中文标题】使用正确的数据类型在 CSharp 中加载 C++ dll【英文标题】:Load C++ dll in CSharp with correct datatypes 【发布时间】:2018-01-17 08:17:38 【问题描述】:需要从 CSharp 中的 DLL 加载此 C++ 方法,我想知道我必须使用哪些数据类型?
WORD FunA (BYTE Num, BYTE *pFrameTX, DWORD nbbitTX, BYTE
*pFrameRX, DWORD *pnbbitRX)
我的第一个方法是:
[DllImport("Example.Dll")]
public static extern UInt16 FunA(byte Num, Byte[] pFrameTX, UInt32 nbbitTX, ref Byte[] pFrameRX, ref UInt32 pnbbitRX);
Byte[] toSend = new Byte[1], toReceive = new Byte[1024];
toSend[0] = 0x26;
UInt32 numberOfBitsReceived = 0;
FunA(Convert.ToByte(1), toSend, 0, ref toReceive, ref numberOfBitsReceived);
这里有什么问题?有人可以帮我找到正确的数据类型和调用用法吗?!
谢谢!
【问题讨论】:
【参考方案1】:猜你错过了 pFrameTX 前面的 ref 修饰符。
[DllImport("Example.Dll")]
public static extern UInt16 FunA(byte Num, ref Byte[] pFrameTX, UInt32
nbbitTX, ref Byte[] pFrameRX, ref UInt32 pnbbitRX);
【讨论】:
【参考方案2】:[DllImport("Example.Dll")]
public static extern UInt16 FunA(byte Num, IntPtr pFrameTX, UInt32
nbbitTX, IntPtr pFrameRX, ref UInt32 pnbbitRX);
// ...
Byte[] toSend = new Byte[1], toReceive = new Byte[1024];
toSend[0] = 0x26;
UInt32 numberOfBitsReceived = 0;
// reserve unmanaged memory for IntPtr
IntPtr toSendPtr = Marshal.AllocHGlobal(Marshal.SizeOf(toSend[0])*toSend.Length),
toReceivePtr = Marshal.AllocHGlobal(Marshal.SizeOf(toReceive[0])*toReceive.Length);
// copy send buffer to Unmanaged memory
Marshal.Copy(toSend, 0, toSendPtr, toSend.Length);
// call C++ DLL method
FunA(Convert.ToByte(1), toSendPtr, 0, toReceivePtr, ref numberOfBitsReceived);
// copy receive buffer from Unmanaged to managed memory
Marshal.Copy(toReceivePtr, toReceive, 0, numberOfBitsReveived/8);
// free memory
Marshal.FreeHGlobal(toSendPtr);
Marshal.FreeHGlobal(toReceivePtr);
【讨论】:
以上是关于使用正确的数据类型在 CSharp 中加载 C++ dll的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 8.1 上使用 OpenCV 在 C++ 中加载图像需要很长时间