结构中的元素结构从c#到c ++

时间:2015-06-22 08:41:04

标签: c# c++ marshalling

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

1 个答案:

答案 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)或类似的东西。

相关问题