我正在编写我的第一个C#应用程序,但幸运的是我必须使用void指针(使用返回句柄的DLL)。根据我的阅读,有几个选择:
不安全的代码,例如,请参阅http://www.c-sharpcorner.com/UploadFile/gregory_popek/WritingUnsafeCode11102005040251AM/WritingUnsafeCode.aspx
在C#程序中写入我的函数declerations IntPtr而不是void *。例如。: public static extern char SupportsWhatever(IntPtr h);
使用ref,例如: public static extern char SupportsWhatever(ref h);
还应该注意,我需要在DLL和C#应用程序之间来回传递信息。
不安全的选项是第一次出现在谷歌上,但出于某种原因,在我的所有功能感觉不对之前写关键词unsafe。
有什么建议吗?
答案 0 :(得分:6)
通常,对于编组情况,使用IntPtr将是此处的首选方法。在安全的代码中允许它,并且非常清楚你的意图是来回编组指针。
这是BCL代表句柄的数量。例如,您可以构造一个表示本机句柄的Cursor from an IntPtr。
答案 1 :(得分:0)
基本规则是如果你需要与它交互作为c#中的指针使用不安全的代码/指针。如果您可以将其视为不透明句柄,请使用IntPtr。如果需要将指向结构的指针传递给非托管代码,则可以使用ref
。
答案 2 :(得分:0)
不安全是编译器的指令,在这种情况下会有指针。来自MSDN
在公共语言运行库(CLR)中,不安全代码被称为 无法验证的代码。 C#中的不安全代码不一定是危险的; 这只是CLR无法验证其安全性的代码。 CLR 因此,只有在完全信任的情况下才会执行不安全的代码 部件。如果您使用不安全的代码,您有责任确保 您的代码不会引入安全风险或指针错误。
我在.net 1.1中使用它,而在C#中使用C ++ API,以前通过PC的COM端口与大型机通信:)