C#-通过LPVARIANT调用非托管C ++函数

|| 我想从托管代码中调用以下函数:
short LS_LoadConfig(LS_ID SensorID,LPVARIANT varConfigPathFile,BOOL bInit)
这是我在C#类中声明extern函数的方式:
[DllImport(\"LineSensor.dll\", EntryPoint = \"#16\")]
private static extern Int16 LS_LoadConfig(
        Int16 deviceId,
        IntPtr variantFilePath,
        int init);
这就是我创建VARIANT实例并获取指向它的指针的方法。然后,我调用C#函数:
string filepath = @\"C:\\Windows\\ ...\";
IntPtr variantFilePath = Marshal.AllocCoTaskMem(200);
Marshal.GetNativeVariantForObject(filepath, variantFilePath);
LS_LoadConfig(device.Id, variantFilePath, initLineSensor);
问题是我不断收到错误消息,例如\“正在调用LS_LoadConfig函数使堆栈不平衡,请检查参数是否匹配非托管签名\”。 看来问题似乎是由第二个参数\“ variantFilePath \\”引起的,就像它没有正确编组并且其在非托管堆上的大小与地址之一(在我的情况下为32位)不一样。我试图将C#函数签名中的类型从IntPtr更改为int,如下所示:
[DllImport(\"LineSensor.dll\", EntryPoint = \"#16\")]
    private static extern Int16 LS_LoadConfig(
        Int16 deviceId,
        int variantFilePath,
        int init);
我试图通过一个随机数调用该函数,但它的性能略好一些,我刚收到一个错误“内存访问冲突”。显然是因为随机数不是有效地址。 有人知道解决这个问题的办法吗? 感谢您提供任何有用的信息。     
已邀请:
           \“调用LS_LoadConfig函数已使堆栈不平衡,请检查参数是否与非托管签名匹配。” 这通常意味着您在本机代码和托管代码之间使用了冲突的调用约定。默认情况下,C#使用stdcall,而c / c ++使用cdecl。尝试指定CallingConvention = CallingConvention.Cdecl。     
        您创建的访问冲突不是更好。它还可以防止生成MDA警告。短于参数类型错误,int16看起来很奇怪,最有可能的麻烦是由CallingConvention引起的。尝试StdCall。 并将第二个参数声明为\“ object \”,其默认封送处理为VARIANT。用\“ ref \”关键字声明它以获得LPVARIANT。     

要回复问题请先登录注册