【发布时间】:2015-05-08 02:05:51
【问题描述】:
我有一个用 C# 实现的 COM 对象(见下文)。它拥有一些IDisposable 资源。我应该在哪里处置该资源?
看起来终结器从未被调用,我无法重载 IUnknown::Release 方法。
[ComVisible(true)]
[Guid("1992EC2F-087A-4264-B5B2-5E2E757F1A75")]
public class ComServer
{
IDisposable disposableResource; //where to dispose IDisposable resource?
public ComServer()
{
disposableResource = File.Open(@"c:\somefile.txt", FileMode.OpenOrCreate);
Console.WriteLine("ComServer.ComServer");
}
~ComServer() //finalizer is never called!
{
disposableResource.Dispose();
Console.WriteLine("ComServer.~ComServer");
}
}
已编辑:COM 服务器用于本机第三方应用程序,无法在客户端调用 Dispose 或在那里进行任何更改。
【问题讨论】:
-
这个问题实际上只是How to dispose of a NET COM interop object on Release() 或RCW & reference counting when using COM interop in C# 的欺骗。简短版本:.NET COM 包装器在您的 COM 对象上保留一个引用计数,因此即使您可以拦截
Release(),您也永远不会看到引用计数变为零。您的客户需要明确致电Dispose()。 -
请注意,如果您的服务器接口有
Dispose()或Close()方法是有意义的,那么您可以将方法放在那里。否则,您需要让客户查询IDisposable并从那里获取Dispose()方法。这在其他两个问题中有更详细的解释。
标签: c# com com-interop