gpt4 book ai didi

c# - 将结构从 C# 传递到 C++

转载 作者:可可西里 更新时间:2023-11-01 16:29:59 25 4
gpt4 key购买 nike

我在 C++ 中有以下结构:

extern "C" __declspec(dllexport) struct SnapRoundingOption
{
double PixelSize;
bool IsISR;
bool IsOutputInteger;
int KdTrees;
};

这是我在 C++ 中的函数声明:

extern "C" __declspec(dllexport) void FaceGenerationDummy(SnapRoundingOption snapOption);

这是对应的C#代码:

// I also tried not specifying Pack, but the same error occurred.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SnapRoundingOption
{
public double PixelSize;
public bool IsISR;
public bool IsOutputInteger;
public int KdTrees;

public SnapRoundingOption(double pixelSize, bool isISR, bool isOutputInt, int kdTrees)
{
PixelSize = pixelSize;
IsISR = isISR;
IsOutputInteger = isOutputInt;
KdTrees = kdTrees;
}
}

[DllImport("Face.dll")]
public static extern void FaceGenerationDummy(SnapRoundingOption snapRoundingOption);

但是,当我通过此测试调用 FaceGenerationDummy 时:

[Test]
public void DummyTest()
{
SimpleInterop.FaceGenerationDummy(new SnapRoundingOption(10, true, false, 1));
}

我发现 KdTrees 在 C++ 中是 0,而不是传入的 1。

我做错了什么?

编辑 1:我在 Windows 7 32 位上使用 Visual Studio 2008。

编辑 2:sizeof(SnapRoundingOption) 都返回相同的数字 – 16。

最佳答案

这里的问题是您如何编码 bool 字段。这些是 C++ 中的单字节,因此需要这样编码:

[StructLayout(LayoutKind.Sequential)]
public struct SnapRoundingOption
{
public double PixelSize;
[MarshalAs(UnmanagedType.U1)]
public bool IsISR;
[MarshalAs(UnmanagedType.U1)]
public bool IsOutputInteger;
public int KdTrees;
}

在 C++ 方面进行匹配:

struct SnapRoundingOption
{
double PixelSize;
bool IsISR;
bool IsOutputInteger;
int KdTrees;
};

我删除了打包设置,以便结构与平台自然对齐。

您还应该确保您的调用约定一致。目前看来,C++ 代码使用 cdecl,而 C# 代码使用 stdcall。例如

[DllImport("Face.dll", CallingConvention=CallingConvention.Cdecl)]

将对齐界面的两侧。

关于c# - 将结构从 C# 传递到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5230147/

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