将结构从C ++ CLI传递到非托管代码

时间:2011-08-16 09:50:23

标签: visual-studio-2008 c++-cli marshalling

我有一个非托管代码,其定义如下:

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&'

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

如果您需要触摸C#中的TEST结构,请确保somestructTEST结构具有相同原始类型的相同成员且大小相同。

如果没有,为什么还要为StructLayout而烦恼?只需在C ++ / CLI中使用somestruct本身,如:

CLIWrapperClass::WrapperMethod()
{
  somestruct test;
  this->NativeClassInstance->Load(test);
}

答案 1 :(得分:0)

本机代码与.net类型不兼容,可以由垃圾收集器移动.net类型。它可以使用钉扎和演员,但这很脆弱。更好的方法是将数据从托管类型复制到本机结构的实例,然后再将其复制回来。