我正在编写一个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可能足以解决问题。从那里开始。