gpt4 book ai didi

c# - 在 .NET 平台调用中使用 unsafe struct * 作为不透明类型而不是 IntPtr 是否有效?

转载 作者:行者123 更新时间:2023-11-30 18:06:48 25 4
gpt4 key购买 nike

.NET Platform Invoke 提倡将指针类型声明为 IntPtr。比如下面的

[DllImport("mylib")]static extern IntPtr get_foo();[DllImport("mylib")]static extern void do_something_foo(IntPtr foo);

但是,我发现在与具有许多指针类型的有趣 native 接口(interface)交互时,将所有内容扁平化为 IntPtr 会使代码很难阅读,并且会删除编译器可以执行的典型类型检查。

我一直在使用一种模式,我将不安全的结构声明为不透明的指针类型。我可以将这个指针类型存储在一个托管对象中,编译器可以为我进行类型检查。例如:

class Foo {   unsafe struct FOO {};  // opaque type   unsafe FOO *my_foo;   class if {     [DllImport("mydll")]     extern static unsafe FOO* get_foo();     [DllImport("mydll")]     extern static unsafe void do_something_foo(FOO *foo);   }   public unsafe Foo() {     this.my_foo = if.get_foo();        }   public unsafe do_something_foo() {     if.do_something_foo(this.my_foo);   }

注意:我并不是要整理结构。 DLL 提供了一个我不应该接触的不透明指针,我只需要将它提供给以后对该 DLL 的调用。

我知道已发布的执行此操作的方法是 IntPtr,但我不喜欢使用无类型指针。当有多种指针类型在托管代码和 native 代码之间移动时,使用 IntPtrs 是非常危险的。使用我的不透明结构指针类型进行类型检查真是天赐之物。

在实践中使用此技术我没有遇到任何问题。然而,我也没有看到任何人使用这种技术的例子,我想知道为什么。上面的代码在 .NET 运行时看来是无效的有什么原因吗?

我的主要问题是关于 .NET GC 系统如何处理“不安全的 FOO *my_foo”。我希望因为底层类型是一个结构,并且它被声明为不安全的,所以 GC 会忽略它。

这个指针是 GC 系统要尝试跟踪的东西,还是干脆忽略它?使用我的技术而不是 IntPtr 安全吗?

最佳答案

看起来答案是"is"...“不安全的指针被视为值类型”,这意味着使用它们来存储不透明类型是安全的。从某种意义上说,它们的工作方式与 IntPtr 一样,但它们带有额外的类型检查,因为不同类型的不安全指针不被认为是相同的,如果您将它们都设为 IntPtr,它们就会被认为是相同的。

有关我写的关于该主题的更详细文章,请查看..

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?waid=1210&aid=339290

关于c# - 在 .NET 平台调用中使用 unsafe struct * 作为不透明类型而不是 IntPtr 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com