アンマネージド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);
ところで、私はさまざまなマーシャルオプションを試しました。現在のエラーは、アクセス違反(保護されたメモリの読み取りまたは書き込みを試みる)です。
ご意見をいただければ幸いです。
ポインターの配列を取得するには、fa_keydescをクラスとして宣言する必要があります。 –