我在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
};
}
}
Marhsaling数据一直有效,直到我必须编写结合了另外两个结构的结构(MainStruct)。 C ++没有收到数据。在c ++网站上我得到:"读取字符串"
的字符时出错有人能说清楚吗?怎么了?在c#或c ++网站上?
答案 0 :(得分:2)
改变这个:
[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#编组程序将在调用SomeCPlusPlusMethod
之前分配一些内存并在之后释放该内存致电SomeCPlusPlusMethod
。如果C ++方法想要保存char* iu
,这一点很重要。在这种情况下,它必须strdup(iu)
或类似的东西。