PInvoke将ANSI C中的结构指针封送为c#中的IntPtr

本文关键字:IntPtr 中的 指针 结构 ANSI PInvoke | 更新日期: 2023-09-27 18:03:18

所以我试图从initparser库中调用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#

PInvoke将ANSI C中的结构指针封送为c#中的IntPtr

initparser库的调用约定可能是cdecl,这意味着您需要更新您的[DllImport]属性用法:

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