gpt4 book ai didi

c# - 从 C# 调用 DLL 时,为什么小结构会错位函数参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:57 29 4
gpt4 key购买 nike

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

[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 个 float 时工作得很好。然而,当它包含 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 必须是命名空间名称,如果它是类名,您将永远无法让它工作。根据损坏的名称,该函数是 __cdecl,您忘记在 [DllImport] 声明中使用 CallingConvention 属性。您应该收到 PInvokeStackImbalance MDA 警告。由于您没有,我必须假设您将其作为 64 位代码运行。

忘记 CallingConvention 本身就足以丢掉堆栈。从这里开始。

关于c# - 从 C# 调用 DLL 时,为什么小结构会错位函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383372/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com