C# 和 void 指针

标签 c# dll marshalling void-pointers

我正在编写我的第一个 C# 应用程序,但幸运的是我必须使用 void 指针(使用返回句柄的 DLL)。根据我的阅读,有几个选项:

  1. 不安全代码,例如参见http://www.c-sharpcorner.com/UploadFile/gregory_popek/WritingUnsafeCode11102005040251AM/WritingUnsafeCode.aspx

  2. 在我的函数 declerations IntPtr 而不是 void* 中编写的 C# 程序中。例如。: public static extern char SupportsWhatever(IntPtr h);

  3. 使用 ref,例如: public static extern char SupportsWhatever(ref h);

还应注意,我需要在 DLL 和 C# 应用程序之间来回编码信息。

不安全选项是第一个在 Google 上弹出的选项,但出于某种原因,在我的所有函数之前写关键字不安全感觉不对。

有什么建议吗?

最佳答案

通常,对于编码情况,使用 IntPtr 将是此处的首选方法。它在安全代码中是允许的,并且非常清楚地表明您的意图是来回编码(marshal)指针。

这是 BCL 中代表句柄的部分。例如,您可以构造一个 Cursor from an IntPtr代表 native 句柄。

关于C# 和 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8199874/

相关文章:

c# - LINQ 'select new' 是做什么的?

c# - WCF 中长时间运行的异步线程

python - 使用 python : SETPATHdll error 访问 Refprop

c# - 使用类名获取用于我们项目的引用 dll 名称

c# - 当数据读取器可能没有特定列时要检查什么?

c# - 在运行时添加属性

java - JNA 通过引用 dll 传递字符串但不返回

java - 从 xpath 中查找包含标签作为 Java 子元素的字符串

java - 使用 Castor 进行编码和解码

json - 无法将字符串解码为 int64 类型的 Go 值