我创建了一个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#控件并单击关闭按钮时,它会关闭我的测试表单,但测试应用程序仍在调试模式下运行 - 运行按钮被禁用
答案 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()