使用正确的数据类型在 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++ 中加载图像需要很长时间

在 iOS 中加载/保存设置

如何在红移光谱表中加载正确的数据?

无法以正确的形式在 Hive 表中加载数据

无法在 Visual C++ 中加载 SQL 驱动程序(但在 QtCreator 中加载)

使用 DevIL 在 C++ OpenGL 中加载纹理