所以我试图从iniParser库中调用C#中的非托管DLL。我目前正在绊倒正确的方法来编组非托管库中函数返回和使用的结构指针。
在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 :(得分:4)
iniParser库的调用约定可能是cdecl,这意味着您需要更新[DllImport]
属性用法:
[DllImport("iniParser.dll", CallingConvention = CallingConvention.Cdecl)]