2013-03-10 61 views
1

所以我試圖從iniParser PInvoke一個非託管的DLL在C#中。我目前正在絆倒正確的方式來編組返回並由非託管庫中的函數採用的結構指針。PInvoke編組結構指針從ANSI C作爲一個IntPtr在C#

在C:

__declspec(dllexport) dictionary * iniparser_load(const char * ininame); 

在C#:

[DllImport("iniParser.dll")] 
private static extern IntPtr iniparser_load(string filename); 

C語言中的字典結構:

typedef struct _dictionary_ { 
    int    n ;  /** Number of entries in dictionary */ 
    int    size ; /** Storage size */ 
    char  ** val ; /** List of string values */ 
    char  ** key ; /** List of string keys */ 
    unsigned  * hash ; /** List of hash values for keys */ 
} dictionary ; 

據我瞭解,在C#中實際訪問的結構,我需要爲C結構創建一個對應物,但我不需要訪問C#中的結構。

當函數被調用在C#中,我得到以下錯誤:

A call to PInvoke function 'CacheExplorer!CacheExplorer.iniParser::iniparser_load' 
has unbalanced the stack. This is likely because the managed PInvoke signature 
does not match the unmanaged target signature. Check that the calling convention 
and parameters of the PInvoke signature match the target unmanaged signature. 

但如何管理的簽名不匹配的非託管簽名? PInvoke是否要求我爲C結構創建一個C#對象?我所需要的基本上是C#字典的句柄,訪問成員是完全不必要的,我寧可不將結構轉換爲C#

+0

我不認爲你的問題是由返回類型引起的。 – wRAR 2013-03-10 22:33:44

回答

3

iniParser庫的調用約定可能是cdecl,這意味着您需要更新[DllImport]屬性用法:

[DllImport("iniParser.dll", CallingConvention = CallingConventions.Cdecl)] 
+0

這樣做。現在找出爲什麼它沒有正確加載文件:) – 2013-03-10 22:34:48