2012-03-20 57 views
2

我很難嘗試編組我在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); 

我已經嘗試了一些不同的編組選項的方式。我收到的當前錯誤是訪問衝突(嘗試讀取或寫入受保護的內存)。

任何建議將不勝感激。

+0

您需要將fa_keydesc聲明爲一個類來獲取指針數組。 – 2012-03-21 00:28:48

回答

0

您需要指定數組的大小。假設FA_NPARTS在C是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.ByValArraySizeConst設置也有效。

+0

不幸的嘗試了這個和同樣的問題 – user1281847 2012-03-20 22:20:37

+0

所以上面的答案似乎沒有幫助。我已經嘗試過這種方法。有誰知道在Visual Studio中是否有任何高級調試技術可用來確定C#實際上正在輸出什麼,並試圖將其轉移到沒有源代碼或調試信息的非託管.DLL? – user1281847 2012-03-21 13:48:58