gpt4 book ai didi

c# - 从 C# 到 C++ 的结构中编码结构

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:50 25 4
gpt4 key购买 nike

我在 C# 和 C++ 中有以下结构。

C++:

struct TestA
{
char* iu;
};

struct TestB
{
int cycle1;
int cycle2;
};

struct MainStruct
{
TestA test;
TestB test2;
};

C#:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack = 1)]
internal struct TestA
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
private string iu;

public TestA(Guid Iu)
: this()
{
iu = Iu.ToString("D");
}
}

[StructLayout(LayoutKind.Sequential), Serializable]
internal struct TestB
{
int cycle1;
int cycle2;
}

[StructLayout(LayoutKind.Sequential)]
internal struct MainStruct
{
private TestA testA;
private TestB testB;

private MainStruct(TestA Test_A) : this()
{
testA = Test_A;
}

public static MainStruct Initial(TestA Test_A, TestB Test_B)
{
return new MainStruct(Test_A)
{
testB = Test_B
};
}
}

编码数据一直有效,直到我不得不编写组合其他两个的结构 (MainStruct)。 C++ 不接收数据。在 C++ 站点上,我得到:“读取字符串字符时出错”

有人能解释一下吗?怎么了?在 C# 或 C++ 网站上?

最佳答案

改变这个:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
private string iu;

为此:

[MarshalAs(UnmanagedType.LPStr)]
private string iu;

请注意,此代码仅适用于在 C#->C++ 方向上传递字符串。对于相反的方向(C++->C#),它更复杂,因为 C# 不能轻易地释放 C++ 分配的内存。

其他重要的事情:如果将此结构传递给 C++ 方法,例如:

TestA a = new TestA(Guid.NewGuid());
SomeCPlusPlusMethod(a);

指针 char* iu 的生命周期将在 SomeCPlusPlusMethod 方法调用结束时结束...C# 编码(marshal)拆收器将在调用 之前分配一些内存SomeCPlusPlusMethod 并将在调用 SomeCPlusPlusMethod 后释放该内存。如果 C++ 方法想要保存 char* iu,这很重要。在那种情况下,它必须 strdup(iu) 或类似的东西。

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

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