将结构中的结构从c#封送到c++
Marshal struct in struct from c# to c++
我在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)
或类似的东西。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?