我有一个.Net类,使用
我知道类
Marshal.AllocHGlobal
分配非托管内存给struct
,然后使用Marshal.FreeHGlobal
释放它。我知道类
Microsoft.Win32.SafeHandles
提供了处理这个问题的包装器,但是不清楚如何实例化它们(许多没有构造函数)-应该编写抽象基类的特定实现,还是有一种在extern
声明中使用它们的方法?
SafeHandle
的主要问题是,为了使用Marshal.DestroyStructure
,你需要struct
的Type
... 这使得一切变得更加复杂。你不能使用泛型(因为它们与 pinvoke 不兼容)... 因此你可以有多个SafeHandle
子类(每个Type
一个),或者在SafeHandle
中有一个属性,手动设置struct
的类型... 或者你可以使SafeHandle
的构造函数接受要进行封送的struct
并将Type
设置在一个属性中。 - xanatostry-finally
块,但这并不总是切实可行的。 - Keith