pinvoke:不确定如何使用 dllimport 和导入的库

Posted

技术标签:

【中文标题】pinvoke:不确定如何使用 dllimport 和导入的库【英文标题】:pinvoke: uncertain how to work with dllimport and imported libraries 【发布时间】:2009-02-04 18:23:07 【问题描述】:

我正在对 C++ dll 执行 dllImport,并且我有以下签名。到目前为止,*** 一直很有帮助,所以我想我会扔掉这个,看看我得到了什么。

有什么我应该担心的问题吗?这是我第一次使用 dllimport。

我需要将以下内容导入 C#:

HANDLE FooInit(char* name); //name 似乎是一个类似“COM1”的字符串

int Foo1(HANDLE 句柄, const char** 句); //sentence 似乎是一个类似“Hello World”的字符串

int Foo2(HANDLE 句柄, DWORD* val);

非常感谢!

【问题讨论】:

【参考方案1】:

查看P/Invoke Cheat Sheet(不完整,但快速参考)。 char * 通常变成字符串。 const char ** 比较棘手,因为我无法通过查看它来判断它是指向单个字符串还是字符串数组的指针。

【讨论】:

【参考方案2】:

乍一看,我希望您将 IntPtr 用于所有参数和 HANDLE 返回类型,并将 int 用于 Foo1 和 Foo2 的返回值。

【讨论】:

HAN​​DLE 和 DWORD*,我不太担心,但我不知道从哪里开始 const char** 参数 如果句子变量是 [out] 参数,则传递 StringBuilder 引用。对于 char * 你可以只传递一个字符串。

以上是关于pinvoke:不确定如何使用 dllimport 和导入的库的主要内容,如果未能解决你的问题,请参考以下文章

DllImport 自动选择x64或x86 dll

DllImport 自动选择x64或x86 dll

卸载使用 DllImport 加载的 DLL

函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

C# Marshal / Pinvoke CBitmap?

Pinvoke 中的一个问题