Маршал C # Массив класса как структурный массив для C - PullRequest
4 голосов
/ 07 ноября 2011

Вот мой код:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Foo
{
  UInt32 StartAddr;
  UInt32 Type;
}


[DllImport(DllName, EntryPoint="_MyFunc", CallingConvention = CallingConvention.Cdecl)]
static extern unsafe IntPtr MyFunc([MarshalAs(UnmanagedType.LPArray)] Foo[] Foos);


List<Foo> Foos = new List<Foo>();
Foo1 = new Foo();
Foo1.StartAddr = 1;
Foo1.Type = 2;
Foos.Add(Foo1);
MyFunc(Foos.ToArray());

В DLL на основе C я распечатываю значение Foos [0] .StartAddr и Foos [0] .Type.Это прекрасно работает.

Теперь я хочу добавить конструктор без параметров в структуру, что означает, что я должен переключиться на класс.Изменение только объявления C # со «struct» на «class» приводит к тому, что поврежденные значения передаются в DLL на основе C.

Я считаю, что это должно работать, но я предполагаю, что пропускаю шаг.Как я могу передать массив классов C # как массив структур в код C?

Спасибо!Andy

1 Ответ

4 голосов
/ 07 ноября 2011

Если вам нужен элемент по умолчанию в вашей структуре, вы можете добавить к нему статическое свойство

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct Foo
    {
      UInt32 StartAddr;
      UInt32 Type;

      public static Foo Default
      {
          get 
          {
               Foo result = new Foo();
               result.StartAddr = 200;
               result.Type = 10;
               return result;
          }
      }
    }

А когда вам нужно создать новую Foo структуру, просто позвоните Foo.Default

...