.DLL C++ 函数到 C#
.DLL C++ function to C#
我在使用 C# 的 WPF 项目中使用 mpusbapi.dll。
在 C++ 中,函数原型是:
DWORD MPUSBWrite(HANDLE handle,
PVOID pData,
DWORD dwLen,
PDWORD pLength,
DWORD dwMilliseconds);
而我在 C# 中的 p/invoke 是:
[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
所以,因为我不会让我的所有项目都不安全,所以我想建立下一个发送数据的方法:
unsafe private void SendPacket(byte* SendData, UInt32 SendLength)
{
uint SendDelay = 10;
UInt32 SentDataLength;
openPipes();
MPUSBWrite(myOutPipe, &SendData, SendLength, &SentDataLength, SendDelay);
closePipes();
}
但是 Visual Studios 显示参数的变量类型错误。 "Cannot convert from 'byte**' to 'system.IntPtr'" 和 "Cannot convert from 'uint*' to 'system.IntPtr'"。
我是 C# 的新手,现在指针让我卡住了。我应该如何将 c++ 参数转换为 C#?谢谢!
编辑:
我没有注意到我已经将 Pinvoke 更改为:
[DllImport("mpusbapi.dll", CallingConvention = CallingConvention.Cdecl)]
static extern UInt32 _MPUSBWrite(IntPtr handle,IntPtr pData, UInt32 dwLen,IntPtr pLength, UInt32 dwMilliseconds);
添加:
删除方法调用中的 & 并没有修复最后一个错误并添加了这个 "Use of unassigned local variable 'SendDataLenght'".
我认为没有必要让这些不安全并使用指针。对参数语义做出一些基本假设,您可以使用此声明:
[DllImport("mpusbapi.dll")]
private static extern uint _MPUSBWrite(
IntPtr handle,
byte[] data,
uint dataLength,
out uint sentDataLength,
uint timeoutMS
);
我不知道调用约定应该是什么。您在问题中同时使用 stdcall
和 cdecl
。与其猜测,还不如确定地找出答案。
我在使用 C# 的 WPF 项目中使用 mpusbapi.dll。 在 C++ 中,函数原型是:
DWORD MPUSBWrite(HANDLE handle,
PVOID pData,
DWORD dwLen,
PDWORD pLength,
DWORD dwMilliseconds);
而我在 C# 中的 p/invoke 是:
[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
所以,因为我不会让我的所有项目都不安全,所以我想建立下一个发送数据的方法:
unsafe private void SendPacket(byte* SendData, UInt32 SendLength)
{
uint SendDelay = 10;
UInt32 SentDataLength;
openPipes();
MPUSBWrite(myOutPipe, &SendData, SendLength, &SentDataLength, SendDelay);
closePipes();
}
但是 Visual Studios 显示参数的变量类型错误。 "Cannot convert from 'byte**' to 'system.IntPtr'" 和 "Cannot convert from 'uint*' to 'system.IntPtr'"。 我是 C# 的新手,现在指针让我卡住了。我应该如何将 c++ 参数转换为 C#?谢谢!
编辑: 我没有注意到我已经将 Pinvoke 更改为:
[DllImport("mpusbapi.dll", CallingConvention = CallingConvention.Cdecl)]
static extern UInt32 _MPUSBWrite(IntPtr handle,IntPtr pData, UInt32 dwLen,IntPtr pLength, UInt32 dwMilliseconds);
添加: 删除方法调用中的 & 并没有修复最后一个错误并添加了这个 "Use of unassigned local variable 'SendDataLenght'".
我认为没有必要让这些不安全并使用指针。对参数语义做出一些基本假设,您可以使用此声明:
[DllImport("mpusbapi.dll")]
private static extern uint _MPUSBWrite(
IntPtr handle,
byte[] data,
uint dataLength,
out uint sentDataLength,
uint timeoutMS
);
我不知道调用约定应该是什么。您在问题中同时使用 stdcall
和 cdecl
。与其猜测,还不如确定地找出答案。