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

Posted

技术标签:

【中文标题】从 c# 到 c++ 的结构中的元帅结构【英文标题】:Marshal struct in struct from c# to c++ 【发布时间】:2015-06-22 08:41:04 【问题描述】:

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

【问题讨论】:

这个和***.com/questions/3914802/marshalas-nested-structure一样吗 iuMarshalAs更改为:[MarshalAs(UnmanagedType.LPStr)]。请注意,这仅适用于 C#->C++。如果要将字符串从 C++ 传递到 C#,则需要做其他解决方案。 它就像一个魅力。不知道为什么它曾经工作......无论如何谢谢! 【参考方案1】:

改变这个:

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

【讨论】:

我正在使用:Marshal.StructureToPtr 将数据首先传递给分配的内存,然后传递给 c++,所以我认为应该没有上述问题 @John 使用struct后必须Marshal.DestroyStructure(),否则内存不会被释放。

以上是关于从 c# 到 c++ 的结构中的元帅结构的主要内容,如果未能解决你的问题,请参考以下文章

VS2010中的元帅结构指针

从 C++ 到 C# 的结构中的 Marshal 回调

如何将结构中的char *从c#传递到c++

通过 PInvoke 从 C# 到 C++ 的简单结构中的垃圾数据

如何将结构从 C++ 迁移到 C#

将复杂的结构(带有结构的内部数组)从 C# 传递到 C++