我有一个非托管代码,其定义如下:
void Load(const somestruct& structinst)
{
//dosomething.
}
我想在非托管代码中将结构从CLI传递给此方法作为ref,并在CLI中返回结构。
我尝试在CLI中创建一个结构
[StructLayout(LayoutKind::Sequential, CharSet = CharSet::Ansi, Pack = 2)]
ref struct TEST
{
[MarshalAs(UnmanagedType::SysInt)]
int k;
};
并尝试将结构传递为
CLIWrapperClass::WrapperMethod()
{
TEST test;
this->NativeClassInstance->Load(test);
}
我收到的错误如error C2664: 'NativeClass::Load' : cannot convert parameter 1 from 'Namespace::WrapperClass::TEST' to 'NativeClass::somestruct&'
我将如何实现这一目标?
答案 0 :(得分:0)
如果您需要触摸C#中的TEST
结构,请确保somestruct
和TEST
结构具有相同原始类型的相同成员且大小相同。
如果没有,为什么还要为StructLayout
而烦恼?只需在C ++ / CLI中使用somestruct
本身,如:
CLIWrapperClass::WrapperMethod()
{
somestruct test;
this->NativeClassInstance->Load(test);
}
答案 1 :(得分:0)
本机代码与.net类型不兼容,可以由垃圾收集器移动.net类型。它可以使用钉扎和演员,但这很脆弱。更好的方法是将数据从托管类型复制到本机结构的实例,然后再将其复制回来。