簡體   English   中英

Marshal C#類數組作為結構數組到C

[英]Marshal C# Class Array as Struct Array To C

這是我的代碼:

[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());

在基於C的DLL中,我打印出Foos [0] .StartAddr和Foos [0] .Type的值。 這非常有效。

現在我想在struct中添加一個無參數構造函數,這意味着我必須切換到一個類。 通過僅將C#聲明從“struct”更改為“class”,會導致將損壞的值傳遞給基於C的DLL。

我相信這應該有用,但我認為我錯過了一步。 如何將C#類數組作為結構數組傳遞給C代碼?

謝謝! 安迪

如果您需要在結構中使用默認項,則可以向其添加靜態屬性

    [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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM