2011-11-07 102 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