处理标记为COM互操作的C# DLL

3
我创建了一个纯净的C# dll,并标记为COM互操作。该dll是一个普通用户窗体,没有功能,这是一个实验。
我注册了该DLL并打开了ActiveX测试容器,并实例化我的COM对象。它出现在测试容器中,我可以查看控件的公开方法 - 这些是默认方法,不是我创建的。
然后我从ActiveX测试容器退出,我注意到测试容器仍然在任务管理器中运行,我必须手动杀死该进程。这让我相信测试容器仍然持有对我用于COM互操作的C# dll的引用。
设计者.cs中的默认处理函数是:
 protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);


   }

当我使用测试容器与Quick time一起使用时,它按预期调用了Quick time。当我关闭测试容器时,它正确地处置并且没有留下任务管理器中的痕迹。

问题是:在我的处置方法中必须做什么特定的事情吗?此外,这可能与此无关,但当我创建一个测试项目并启动我的C#控件,然后单击关闭按钮时,它会关闭我的测试表单,但测试应用程序仍在以调试模式运行 - 运行按钮被禁用。

3个回答

3

你可以尝试:

public void IDisposable.Dispose()
{     
   System.Runtime.InteropServices.Marshal.ReleaseComObject(this);
}

通常情况下,这是在从.NET中使用COM对象时执行的操作,对于另一种方式不确定。但是尝试一下也无妨。让我知道它的效果如何;-)
编辑:
您还可以尝试抑制终结:
GC.SuppressFinalize(this);

1
Josh:我尝试将其放入我的测试应用程序中,该应用程序使用C# Dll进行COM互操作,并且我得到的异常是“this”需要是__ComObject类型或派生自__ComObject。\r\n参数名称:o"。 - user38230

1

0
除了重写Dispose(bool)方法外,您还需要重写IDisposable.Dispose()方法,在该方法中调用Dispose(true),然后调用GC.SuppressFinalize(this)。此外,您还需要在Dispose(bool)的重写中对所有实现IDisposable接口的成员调用Dispose()方法。

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