C++;Cli[Marshallas]属性生效的时刻? 如果在C++中CLI声明一个值结构: [StructLayout(LayoutKind::Sequential, CharSet = CharSet::Ansi, Pack = 2)] value struct TEST { public: UInt32 bla; UInt32 foo; [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 10)] String^ somestring; UInt32 bar; };

C++;Cli[Marshallas]属性生效的时刻? 如果在C++中CLI声明一个值结构: [StructLayout(LayoutKind::Sequential, CharSet = CharSet::Ansi, Pack = 2)] value struct TEST { public: UInt32 bla; UInt32 foo; [MarshalAs(UnmanagedType::ByValTStr, SizeConst = 10)] String^ somestring; UInt32 bar; };,struct,c++-cli,marshalling,unmanaged,value-type,Struct,C++ Cli,Marshalling,Unmanaged,Value Type,使用这个结构,行什么时候开始 [marshallas(非托管类型::ByValTStr,SizeConst=10)] 生效? 它是否只有在调用使用dll导入声明的某个本机函数,或者在整个过程中手动编组时才有效 我的问题导致了一个大型项目中一些C模块的原生C函数的C++ Cli Wrapper的实现。 如果我这样做: TEST bla; pin_ptr<TEST> pinner=&bla; 测试bla; pin_ptr pinner=&bla; 是否可以确定,在锁定之后的那

使用这个结构,行什么时候开始 [marshallas(非托管类型::ByValTStr,SizeConst=10)] 生效? 它是否只有在调用使用dll导入声明的某个本机函数,或者在整个过程中手动编组时才有效

我的问题导致了一个大型项目中一些C模块的原生C函数的C++ Cli Wrapper的实现。 如果我这样做:

TEST bla;
pin_ptr<TEST> pinner=&bla;
测试bla;
pin_ptr pinner=&bla;

是否可以确定,在锁定之后的那一刻,我的结构被包装在一起,大小为22字节(整数为3*4,字符串为10)?或者字符串会更大吗?

我将回答您问题的一部分:使用pin_ptr不会导致编组。pin_ptr正在锁定托管对象的地址,而不是将其编组到非托管对象。有关更多详细信息,请参阅。

是的,当您调用已使用[DllImport]属性声明的非托管函数且该函数具有类型TEST的参数时,它将生效。或者使用marshal::StructureToPtr或marshal::PtrToStructure显式封送结构。它不会在您的第二段代码中生效。也没有必要在那里使用pin_ptr,bla变量存储在堆栈上,因此不必固定


这是在C++/CLI中很少执行的操作。因为您已经可以从.h文件获得非托管版本的测试。您只需创建非托管版本并复制成员,这比让pinvoke封送员处理要快得多。但你可以,至少它能处理好绳子。使用Marshal::StructureToPtr()。

使用固定大小的缓冲区:

我仍然清楚这一点,但如果[MarshalAs(UnmanagedType::ByValTStr,SizeConst=10)]具有一般效果,我的结构大小和顺序将始终相同…但我不知道是否相同?另外,我认为pin\u ptr将结构的盒装版本固定在这里。副本,而不是原始的。您的结构包含字符串的句柄。
marshallas
声明没有在C#或C++/CLI中定义固定长度数组,C#具有该和的
fixed
关键字。此外,
pin_ptr
对于堆栈变量是不必要的,只有托管堆中的数据可以移动,因此需要被固定。