繁体   English   中英

配置标记为COM interop的C#DLL

[英]Dispose C# DLL marked for COM interop

我创建了一个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);


   }

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

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

你可以尝试:

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

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

编辑:

您也可以尝试压制终结:

GC.SuppressFinalize(本);

MSDN有一篇关于如何实现IDisposable的相当全面的文章。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM