2011-11-07 40 views
4

這是我的代碼:元帥C#類數組作爲結構陣列爲將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]。鍵入的值。這很好。

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

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

謝謝!安迪

+1

是的,將無法正常工作。該數組將被封送爲Foo **而不是Foo *。指向Foo的指針數組。沒有乾淨的解決方法,手動編組在這裏非常難看。如果您不能更改C代碼,請不要這樣做。 –

回答

4

如果你需要在你的結構默認項目可以靜態屬性添加到它

[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