관리되지 않는 C .DLL 파일을 호출하는 데 필요한 C# 프로그램에서 정의한 구조체를 마샬링하는 데 문제가 있습니다. 소스 코드에 액세스 할 수 없습니다. 에 대한. 샘플 관리되지 않는 C 프로그램 C 프로그램은 문제없이이 .DLL을 호출 할 수 있습니다. 문제 구조는 fa_keylist입니다. C 헤더 파일에서문제 C#DALL 구조체를 마샬링
:이 나는 문제를 데 구조에 포함 된 여러 하위 구조는
[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를 클래스로 선언해야합니다. –