2012-03-20 22 views
2

アンマネージドC .DLLファイルを呼び出すために必要なC#プログラムで定義した構造体のマーシャリングに問題があります。ソースコードにアクセスできないために。サンプルのアンマネージCプログラムCプログラムは、問題なしでこの.DLLを呼び出すことができます。問題の構造は以下のfa_keylistです。 Cヘッダファイルから問題C#DLLを呼び出すための構造体マーシャリング

::私はとの問題を抱えていた構造に含まれる複数のサブ構造がある

[StructLayout(LayoutKind.Sequential)] 
    public struct fa_keypart 
    { 
     public Int16 kp_start;        
     public Int16 kp_leng;          
     public Int32 kp_flags;      
    } 


    [StructLayout(LayoutKind.Sequential)] 
    public struct fa_keydesc 
    { 
     public Int32 k_flags;        
     public Int32 k_nparts;         
     [MarshalAs(UnmanagedType.ByValArray)] 
     public fa_keypart[] kparts; 
    }; 


    [StructLayout(LayoutKind.Sequential)] 
    public struct fa_keylist 
    { 
     public Int32 kl_nkeys;         
     public UInt32 kl_reserve;        
     [MarshalAs(UnmanagedType.ByValArray)] 
     public fa_keydesc[] kl_keys;  
    } 

DLLIMPORTを:C#ので

struct fa_keypart { 
    short kp_start;      
    short kp_leng;      
    long kp_flags;      
}; 


struct fa_keydesc { 
    long k_flags;      
    long k_nparts;      
    struct fa_keypart k_part [FA_NPARTS];           
}; 


struct fa_keylist { 
    long kl_nkeys;      
    char kl_reserve[4];     
    struct fa_keydesc *kl_key [FA_NKEYS]; 
} 

が、私はこのように定義されています実際の呼び出しの署名は、次のように定義されます。

[STAThread] 
    [DllImport("F4AGFCFA.dll", EntryPoint = "cobfa_open", CallingConvention = CallingConvention.StdCall)] 
    public static extern Int32 cobfa_open(
         string fileName, 
         Int32 openFlags, 
         ref fa_keylist keyList, 
         Int32 recordLength); 

関数の呼び出しは次のように記述されます。

handle = cobfa_open(filename, fileFlags, ref keyList, 80); 

ところで、私はさまざまなマーシャルオプションを試しました。現在のエラーは、アクセス違反(保護されたメモリの読み取りまたは書き込みを試みる)です。

ご意見をいただければ幸いです。

+0

ポインターの配列を取得するには、fa_keydescをクラスとして宣言する必要があります。 –

答えて

0

アレイのサイズを指定する必要があります。 CでFA_NPARTSが128であると仮定すると、次の操作を行うことができます:

[StructLayout(LayoutKind.Sequential)] 
public struct fa_keydesc 
{ 
    public Int32 k_flags;        
    public Int32 k_nparts;         
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] 
    public fa_keypart[] kparts; 
}; 

UnmanagedType.ByValArrayだけのようにも設定SizeConstで動作します。

+0

残念なことに、これと同じ問題を試しました – user1281847

+0

上記の回答は役に立たないようです。私はすでにこのアプローチを試していました。 C#が実際に出力されているかどうかを確かめ、ソースコードやデバッグ情報がない管理されていない.DLLに渡そうとしているかどうかを確認するために、Visual Studioで使用できる高度なデバッグ手法があるかどうかは誰にも知られていますか? – user1281847