【问题标题】:Releasing .NET objects from VB6 code从 VB6 代码中释放 .NET 对象
【发布时间】:2011-03-05 14:30:02
【问题描述】:

.NET Rocks! Show 561 上,Carl 和 Richard 谈到了释放在托管代码中实例化的非托管对象。如果必须释放在托管 .NET 代码中实例化的 COM 对象,则必须调用 System.Runtime.InteropServices.Marshall.ReleaseComObject。从 COM 代码中释放 .NET 对象时,您是否必须(或应该做)任何类似的事情,或者依靠垃圾收集器来释放对象是否足够?

【问题讨论】:

    标签: .net com vb6 interop


    【解决方案1】:

    只要您像管理任何其他 COM 对象 (set netObj = Nothing) 一样管理 COM Callable Wrapper 的引用计数,COM 和 .NET 就会处理剩下的事情。

    【讨论】:

    • +1。我只是提一下,通常你不需要做任何事情。如果netObj 是一个局部变量,VB6 运行时将在例程结束时立即释放它。如果netObj 是模块级变量或全局变量,您只需要Set netObj = Nothing
    【解决方案2】:

    我还要补充一点,如果您使用 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 对象被销毁时,事件不会被清除为空。有些东西是通过艰难的方式学到的……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2017-04-28
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      相关资源
      最近更新 更多