C ++ Cli [MarshalAs] приписывает момент вступления в силу? - PullRequest
1 голос
/ 30 марта 2011

, если я объявляю значение Struct в 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;                   
  };

и использую эту структуру, когда делает строку [MarshalAs (UnmanagedType :: ByValTStr, SizeConst = 10)] вступить в силу?Имеет ли это эффект, только если я вызываю какую-то нативную функцию, которая объявлена ​​с помощью импорта dll, или если я делаю маршалинг вручную или все время?

Мой вопрос приводит к реализации C ++ Cli Wrapper для функций Native C длянекоторые модули C # в большом проекте.если я сделаю что-то вроде этого:

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

Это точно, что в этот момент после закрепления моя структура обернута вместе и имеет размер 22 байта (3 * 4 для целого числа и 10 для строки)?Или строка может быть больше?

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Да, он вступает в силу, когда вы вызываете неуправляемую функцию, которую вы объявили с атрибутом [DllImport], и эта функция имеет аргумент типа TEST.Или когда вы явно упорядочиваете структуру с помощью Marshal :: StructureToPtr или Marshal :: PtrToStructure. не вступает в силу во втором фрагменте.Также нет необходимости использовать pin_ptr <>, переменная bla хранится в стеке, поэтому ее не нужно закреплять.

Это то, что вы очень редко делаете в C ++/ CLI.Поскольку у вас уже есть неуправляемая версия TEST из файла .h.Вы просто создадите эту неуправляемую версию и скопируете участников, намного быстрее, чем оставите ее на усмотрение маршала.Но вы можете, по крайней мере, он заботится о струне.Используйте Marshal :: StructureToPtr ().

0 голосов
/ 31 марта 2011

Вместо этого используйте буфер фиксированного размера: Как указать буфер фиксированного размера в C ++ / CLI?

0 голосов
/ 30 марта 2011

Я отвечу на одну часть вашего вопроса: использование pin_ptr не вызывает маршаллинг. pin_ptr блокирует адрес управляемого объекта - он не передает его неуправляемому объекту. Подробнее см. http://msdn.microsoft.com/en-us/library/1dz8byfh(v=vs.80).aspx.

...