だから私はiniParserライブラリから C# でアンマネージ DLL を PInvoke しようとしています。私は現在、アンマネージ ライブラリ内の関数によって返され、取得される構造体ポインターをマーシャリングする正しい方法につまずいています。
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# に変換したくありません。