非托管代码块 怎么释放资源啊
非托管代码块 怎么释放资源啊
我用C++写了一个库,用C#调用,C++中写了资源释放,但C#中不知道如何写;
下面就是我调用的非托管代码块:
[DllImport("DtPlayDll.dll")]
private static extern int Func(double alltime, double ctime, string[] b);
请问怎么释放这个的资源啊,希望有源码参考哦
------解决方案--------------------不知道,不过我猜一下,是不是这样的
class A1{public int Data{get;set;}}
class A2{public A1 A1p{get;set;}}
class A3{public A2 A2p{get;set;}}
class Program{
static void Main(){
A3=new A3();
A3.A2p=new A2();
A3.A1p=new A1();
A3.A1p.Data=100;
//
A3=null; //MARK 1
}
}
在MARK 1 处,如果是托管代码,没问题,编译器会帮我们把A3相关的所有内存资源全部释放.
如果是unsafe的,那我觉得MARK1处可能会造成"内存遗失";
不知道我的理解对没对,请楼下的朋友,指正,谢谢!
------解决方案--------------------
------解决方案--------------------不同的非托管有不同的释放方式
------解决方案-------------------- IDispose Finalizer
作用 释放托管/非托管资源 释放非托管资源
Finalize 方法的使用准则:
l 仅在要求终结的对象上实现 Finalize。存在与 Finalize 方法相关的性能开销。
l 如果需要 Finalize 方法,应考虑实现 IDisposable,以使类的用户可以避免因调用 Finalize 方法而带来的开销。
l 不要提高 Finalize 方法的可见性。该方法的可见性应该是 protected,而不是 public。
l 对象的 Finalize 方法应该释放该对象拥有的所有外部资源。此外,Finalize 方法应该仅释放由该对象控制的资源。Finalize 方法不应该引用任何其他对象。
l 不要对不是对象的基类的对象直接调用 Finalize 方法。在 C# 编程语言中,这不是有效的操作。
l 应在对象的 Finalize 方法中调用基类的 Finalize 方法。
Dispose 方法的使用准则:
l 在封装明确需要释放的资源的类型上实现释放设计方案。用户可以通过调用公共 Dispose 方法释放外部资源。
l 在通常包含控制资源的派生类型的基类型上实现释放设计方案,即使基类型并不需要也如此。如果基类型有 Close 方法,这通常指示需要实现 Dispose。在这类情况下,不要在基类型上实现 Finalize 方法。应该在任何引入需要清理的资源的派生类型中实现 Finalize。
l 使用类型的 Dispose 方法释放该类型所拥有的所有可释放资源。
l 对实例调用了 Dispose 后,应通过调用 GC.SuppressFinalize 方法禁止 Finalize 方法运行。此规则的一个例外是当必须用 Finalize 完成 Dispose 没有完成的工作的情况,但这种情况很少见。
l 如果基类实现了 IDisposable,则应调用基类的 Dispose 方法。
l 不要假定 Dispose 将被调用。如果 Dispose 未被调用,也应该使用 Finalize 方法释放类型所拥有的非托管资源。
l 当资源已经释放时,在该类型上从实例方法(非 Dispose)引发一个 ObjectDisposedException。该规则不适用于 Dispose 方法,该方法应该可以在不引发异常的情况下被多次调用。
l 通过基类型的层次结构传播对 Dispose 的调用。Dispose 方法应释放由此对象以及此对象所拥有的任何对象所控制的所有资源。例如,可以创建一个类似 TextReader 的对象来控制 Stream 和 Encoding,两者均在用户不知道的情况下由 TextReader 创建。另外,Stream 和 Encoding 都可以获取外部资源。当对 TextReader 调用 Dispose 方法时,TextReader 应继而对 Stream 和 Encoding 调用 Dispose,使它们释放其外部资源。
l 考虑在调用了某对象的 Dispose 方法后禁止对该对象的使用。重新创建已释放的对象是难以实现的方案。
l 允许 Dispose 方法被调用多次而不引发异常。此方法在首次调用后应该什么也不做。
------解决方案--------------------在import你的释放资源的方法呗
------解决方案--------------------你的资源是什么?
1:如果是由C#申请的资源,然后转换给非托管的,由C#释放。
2:如果是由非托管的代码申请的资源,你只能拜托它释放,如果它没有提供这个功能,那你就只能通过其它方法来解决。比如:重启应用程序或者自己看如何补上释放的非托管代码。