C#和void指针

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

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

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

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

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

不安全的选项是第一个出现在谷歌上的选项,但出于某种原因,在我的所有function都感觉不对之前编写关键字unsafe。

有什么建议?

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

这是BCL表示处理的多少。 例如,您可以从表示本机句柄的IntPtr构造Cursor 。

基本规则是如果你需要与它交互作为c#中的指针使用不安全的代码/指针。 如果您可以将其视为不透明句柄,请使用IntPtr。 如果需要将指向结构的指针传递给非托管代码,则可以使用ref

不安全是指向编译器的指令,在此上下文中将存在指针。 来自MSDN

在公共语言运行库(CLR)中,不安全的代码称为无法validation的代码。 C#中的不安全代码不一定是危险的; 它只是CLR无法validation其安全性的代码 。 因此,只有在完全受信任的程序集中,CLR才会执行不安全的代码。 如果使用不安全的代码,则您有责任确保代码不会引入安全风险或指针错误。

我在.net 1.1中使用它,而在C#中使用C ++ API,它曾经通过PC的COM端口与大型机通信:)