我正在编写一个C#/ c++应用程序,当我尝试传递仅包含两个浮点数的结构时遇到了问题。例如:

[DllImport("Resources\\CppInterface", EntryPoint = "?ReadDllTest@ScriptParserInterface@@YA?AVDllTest@@PAVScriptParser@@PB_W@Z", CharSet = CharSet.Unicode)]
private static extern DllTest ReadDllTestS(IntPtr scriptParser, string name);

当DLLTest包含3或4个浮点数时,效果很好。但是,如果包含2,则intptr和传递的字符串指针在C++端最终会错位1个字节。

知道是什么原因造成的吗?

结构布局示例:
[StructLayout( LayoutKind.Sequential )]
public struct DllTest
{
    public float a, b;/*, c, d; (works if c or/d are in)*/

    DllTest( float i, float j )
    {
        a = i;
        b = j;
    }
}

C++方面:
DllTest ScriptParserInterface::ReadDllTest( ScriptParser* scriptParser, const wchar_t* name )
{
     return DllTest(); /* If only using two variables in DLLTest. scriptParser and name no longer work, but are located at *((&scriptParser)-1) and *((&name)-1)
}

任何建议将不胜感激。谢谢。

最佳答案

ScriptParserInterface必须是 namespace 名称,如果它是类名称,则永远不会使其起作用。根据错误的名称,该函数是__cdecl,您忘记了在[DllImport]声明中使用CallingConvention属性。您应该已经收到PInvokeStackImbalance MDA警告。既然您没有,我必须假设您将其作为64位代码运行。

本身就忘记了CallingConvention可能足以解决问题。从那里开始。

10-07 16:53