2012-03-20 2 views
2

관리되지 않는 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); 

나는 다양한 마샬링 옵션을 시도해 봤습니다. 현재받는 오류는 액세스 위반 (보호 된 메모리를 읽거나 쓰려고 시도 함)입니다.

의견을 보내 주시면 대단히 감사하겠습니다.

+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

위의 답변은 도움이되지 않습니다. 나는 이미이 접근법을 시도했다. 누구든지 Visual Studio에서 사용할 수있는 고급 디버깅 기술이 있다면 C#이 실제로 출력되고 있으며 소스 코드가 없거나 사용 가능한 디버깅 정보가없는 관리되지 않는 .DLL에 전달하려고 시도하고 있는지 확인하려고합니까? – user1281847