配置标记为COM interop的C#DLL

时间:2009-01-23 13:54:58

标签: c#

我创建了一个vanilla C#dll并将其标记为COM inter op。 dll是一个没有功能的普通用户表单,因为这是一个实验。

我注册了DLL并打开了活动的x测试容器并实例化了我的COM对象。它显示在测试容器中,我可以查看控件的公开方法 - 这些是默认方法,而不是由我创建的。

然后我从活动的x测试容器中退出,我注意到测试容器仍然潜伏在任务管理器中,我不得不手动终止该过程。这让我相信测试容器仍然提供了我的C#dll暴露给com inter op的引用。

designer.cs中的默认dispose方法是

 protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);


   }

当我使用具有Quick time的测试容器时,它会按预期调用快速时间,当我关闭测试容器时,它正确处理并且没有在任务管理器中留下足迹。

问题 - 在我的处理方法中我必须做一些特定的事情吗?此外,这可能不相关,但是当我创建一个测试项目并启动我的c#控件并单击关闭按钮时,它会关闭我的测试表单,但测试应用程序仍在调试模式下运行 - 运行按钮被禁用

3 个答案:

答案 0 :(得分:3)

你可以尝试:

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

通常在从.net中使用COM对象时执行此操作,而不确定其他方式。但尝试不会有害。让我知道它是如何成功的; - )

编辑:

你也可以尝试压制终结:

GC.SuppressFinalize(本);

答案 1 :(得分:1)

MSDN在how to implement IDisposable上有一篇非常全面的文章。

答案 2 :(得分:0)

除了重写Dispose(bool)之外,你还需要在该方法中覆盖IDisposable.Dispose(),调用Dispose(true)然后调用GC.SurpressFinalize(this)。此外,您必须在所有在Dispose(bool)的覆盖中实现IDisposable的成员上调用Dispose()