我很難嘗試編組我在C#程序中定義的結構,這是調用非託管C .DLL文件所必需的我無權訪問源代碼對於。一個示例非託管C程序C程序可以調用這個.DLL沒有問題。下面的問題結構是fa_keylist。有包含在我有結構問題的多個子結構:問題編組C#結構調用C .DLL
從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];
}
在C#中,我有這樣的定義爲:
[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實際呼叫的簽名定義爲:
[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聲明爲一個類來獲取指針數組。 – 2012-03-21 00:28:48