Передача структуры из C ++ CLI в неуправляемый код - PullRequest
2 голосов
/ 16 августа 2011

У меня есть неуправляемый код со следующим определением,

void Load(const somestruct& structinst)
    {
            //dosomething.
    } 

Я хочу передать структуру из CLI этому методу в неуправляемом коде в качестве ссылки и вернуть структуру в 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 голосов
/ 17 августа 2011

нативный код несовместим с типами .net, которые могут перемещаться сборщиком звука. можно использовать пиннинг и бросок, но это хрупко. лучше просто скопировать данные из управляемого типа в экземпляр нативной структуры и обратно.

0 голосов
/ 17 августа 2011

Если вам нужно дотронуться до структуры TEST из C #, убедитесь, что структуры somestruct и TEST имеют одинаковых членов одного и того же примитивного типа с одинаковым размером.

Если нет, зачем беспокоиться о StructLayout? Просто зайдите и используйте somestruct в C ++ / CLI, например:

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