从VB6代码中释放.NET对象

3
.NET Rocks! Show 561中,Carl和Richard谈到了释放在托管代码中实例化的非托管对象。如果您必须释放在托管.NET代码中实例化的COM对象,则必须调用System.Runtime.InteropServices.Marshall.ReleaseComObject。在从COM代码中释放.NET对象时是否需要执行类似的操作(或应该执行类似的操作),或者仅依靠垃圾收集器来释放对象是否足够?
2个回答

4
只要你像处理其他COM对象一样管理COM可调用包装器的引用计数(set netObj = Nothing),COM和.NET就会处理剩下的事情。

1
+1. 我只想提一下,通常情况下你不需要做任何事情。如果 netObj 是一个局部变量,VB6 运行时会在程序结束时立即释放它。只有当 netObj 是模块级别的变量或全局变量时,你才需要 Set netObj = Nothing - MarkJ

3

我还想补充一点,如果你在VB6中使用事件,你需要在DotNet代码中添加一个函数来释放事件。例如:

class SomeEventClass
{
    public event EventHandler SomeEvent;

    public void DoSomething()
    {
        var someEvent = SomeEvent;
        if (someEvent != null)
        {
             someEvent(this, new EventHandlerArgs());
        }
    }

    public void ReleaseFromEvents()
    {
         SomeEvent = null;
    }

}

这是必要的,因为有时当VB6对象被销毁时,事件不会清空为null。这是通过苦难学来的经验...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接