2012-02-23 37 views
3

を渡すと、私はC#で初心者本当にMA:私はいくつかの複雑な構造体とCのDLLを持っているCおよびC#(DLLおよびPの呼び出し)の間に構造体の配列を含む構造体

typedef struct { 
    int a; 
    int b; 
} simple_struct; 

typedef struct { 
    int d; 
    int e; 
    simple_struct f[20]; 
    short g; 
    simple_struct h[20]; 
    short i; 
} complex_struct; 

問題は、私はということです私のC#アプリケーションとこの構造とのインタフェースができません! DLLで

は、機能のGetData(complex_struct *体mystruct)があると私はC#のからそれを呼び出すshoudので、私が作成:

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    unsafe struct simple_struct { 
     public int a; 
     public int b; 
    } ; 

    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
    unsafe struct complex_struct { 
     public int d; 
     public int e; 
     public simple_struct[] f; 
     public short g; 
     public simple_struct[] h; 
     public short i; 
    } ; 

しかし、問題は、私はGetDataのの引数としてcomplex_structを渡す際に、すべてのフィールドがsimple_structの私の2つの配列(Iをfとhを意味する)私を形成するが、ないバック満たされています!彼らの価値はヌルです!

いくつかのいずれかが、私を助けてくださいおかげ


こんにちはとお返事に感謝、

することができます私はあなたが言ったように行っているが、私はGetDataメソッドを呼び出すときに、私はまだ別の問題があり、任意のメッセージなしでプロセスがクラッシュした(例外の種類):これは私のCシャープコードが

ある: 名前空間dll_test_import_c_sharp {クラスプログラム { [StructLayout(LayoutKind.Sequential、パック= 1)] 構造体simple_struct { 公共のint。 公共int型のB; };

 [StructLayout(LayoutKind.Sequential, Pack = 1)] 
     struct complex_struct { 
      public int d; 
      public int e; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
      public simple_struct[] f; 
      public short g; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
      public simple_struct[] h; 
      public short i; 
     } ; 




     [DllImport("test_dll.dll", CharSet = CharSet.Unicode)] 
     static extern int GetData(ref complex_struct a); 



     static void Main(string[] args) 
     { 
      complex_struct a = new complex_struct(); 
      GetData(ref a); 
      return; 
     } 

    } 
} 

私はprintfのたくさんの私のGetDataを行っていると、それらのすべてがうまく実行され、それは復帰 "命令がクラッシュしたように思えます!

私はあなたが言ったように行っている


こんにちはとお返事に感謝、

...参照するか、外でのGetDataを呼び出すために、それらの両方が動作しませんみましたが、私はまだ任意のメッセージ(例外の一種)することなく、私はGetDataメソッドを呼び出す別の問題、プロセスがクラッシュを持っている:

これは私のCシャープコードです: 名前空間dll_test_import_c_sharp { クラスプログレラム {[StructLayout(LayoutKind.Sequential、パック= 1)] 構造体simple_struct { 公共のint。 公共int型のB; };

 [StructLayout(LayoutKind.Sequential, Pack = 1)] 
     struct complex_struct { 
      public int d; 
      public int e; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
      public simple_struct[] f; 
      public short g; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
      public simple_struct[] h; 
      public short i; 
     } ; 




     [DllImport("test_dll.dll", CharSet = CharSet.Unicode)] 
     static extern int GetData(ref complex_struct a); 



     static void Main(string[] args) 
     { 
      complex_struct a = new complex_struct(); 
      GetData(ref a); 
      return; 
     } 

    } 
} 

私はprintfのたくさんの私のGetDataを行っていると、それらのすべてがうまく実行され、それは復帰 "命令がクラッシュしたように思えます!

私がrefまたはアウトでのGetDataを呼び出すために、それらの両方が動作しませんみました...

+0

によってだということを指定するには、struct上の配列定義を変更する必要がありますか?ネイティブ構造体がパックされるのはむしろ珍しいことです。 –

+0

梱包は私のプログラムでさらに使用するためのものです。 – hzrari

+0

私は分かりません。ネイティブ構造体がパックされていない場合は、interopが失敗する可能性があります。 –

答えて

6

あなたが梱包されているなぜそれが価値/インライン配列

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
unsafe struct complex_struct { 
    public int d; 
    public int e; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
    public simple_struct[] f; 
    public short g; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] 
    public simple_struct[] h; 
    public short i; 
} ; 
+0

ありがとう、これは私のために働いた:) – hzrari

関連する問題