c# - 处置标记为 COM 互操作的 C# DLL

标签 c#

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

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

然后我退出 active x 测试容器,我注意到测试容器仍然潜伏在任务管理器中,我不得不手动终止进程。这让我相信测试容器仍然持有对为 com inter op 公开的我的 C# dll 的引用。

designer.cs中默认的dispose方法是

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


   }

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

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

最佳答案

你可以试试:

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

通常,您在从 .net 中使用 COM 对象时会这样做,但不确定其他方式。但尝试一下也无妨。让我知道结果如何;-)

编辑:

你也可以尝试抑制终结:

GC.SuppressFinalize(这个);

关于c# - 处置标记为 COM 互操作的 C# DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/472956/

相关文章:

c# - 是否可以自动为 SQL Server 和 LINQ to SQL 中的所有表名添加前缀?

C# 将 DateTime 存储到 MYSQL 中的时间戳列

c# - 可以让 Asp.Net Core 中的 Swagger 为非 MVC Controller 的类生成文档吗

c# - 从 HttpTrigger 函数读取 Azure IoT 中心遥测

c# - 将Json反序列化为在Asp.net中实现Ienumerable的类

c# - 如何以编程方式控制 Firefox,最好使用 C# 应用程序?

c# - Observable.Delay 或 Observable.Buffer 重用同一线程

c# - WPF 绑定(bind)到子集合

c# - 如何在运行时检索事件的订阅者列表?

c# - 保护自定义图像的图像文件名-单击验证码