在.NET Rocks! Show 561上,Carl和Richard谈到了释放在托管代码中实例化的非托管对象。如果必须释放在托管.NET代码中实例化的COM对象,则必须调用System.Runtime.InteropServices.Marshall.ReleaseComObject
。从COM代码中释放.NET对象时,是否有类似的事情要做(或应该做),还是依靠垃圾收集器来释放对象呢?
答案 0 :(得分:4)
只要您管理COM Callable Wrapper的引用计数,就像执行任何其他COM对象(set netObj = Nothing
)一样,COM和.NET将负责其余的工作。
答案 1 :(得分:3)
我还想补充一点,如果您使用VB6中的事件,您将需要在DotNet代码中添加一个函数来释放事件。 E.g:
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。有些东西学得很难......