将结构中的结构从c#封送到c++

Marshal struct in struct from c# to c++

本文关键字:结构 c++      更新时间:2023-10-16

我在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++网站上?

更改此项:

[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);

指针CCD_ 1的寿命将在CCD_。。。C#封送拆收器将在调用SomeCPlusPlusMethod之前分配一些内存,并在调用SomeCPlusPlusMethod之后释放该内存。如果C++方法想要保存char* iu,这一点非常重要。在这种情况下,它必须是strdup(iu)或类似的东西。