.DLL C ++函数到C#

时间:2017-06-19 15:19:35

标签: c# c++ pointers pinvoke

我在使用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向我展示了参数的变量类型的错误。 "无法转换为'字节**'到' system.IntPtr'"和"无法转换为' uint *'到' 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);

添加: 删除&在方法调用中没有修复上一个错误并添加了这个错误"使用未分配的本地变量' SendDataLenght'"。

1 个答案:

答案 0 :(得分:1)

我认为不需要任何这些是不安全的并且使用指针。对参数语义做一些基本假设,您可以使用此声明:

[DllImport("mpusbapi.dll")]
private static extern uint _MPUSBWrite(
    IntPtr handle, 
    byte[] data, 
    uint dataLength, 
    out uint sentDataLength, 
    uint timeoutMS
);

我不知道调用约定应该是什么。您在问题中同时使用stdcallcdecl。而不是猜测,你需要明确地找出答案。