使 COM 可见的 .NET 程序集发布 COM 引用



我有一个COM可见的C#程序集。它反过来与第三方 COM 应用程序通信。我的问题是,当我从 VBA 释放对 C# 程序集的引用时,C# 程序集使第三方应用程序保持打开状态。

' Call assembly from VBA
Dim asm : Set asm = CreateObject("MyCSharpAssembly") 
' Get a managed object exposed by the assembly
' managedObject communicates with a 3-rd party COM application
Dim managedObject : Set managedObject = asm.GetManagedObject()
' When I release managedObject from VBA, the 3rd party application stays open.
Set managedObject = Nothing

我尝试在托管对象中实现 IDisposable 模式并显式释放 COM 对象。这有效,但我仍然必须从 VBA 显式调用 Dispose 方法。仅将对托管对象的引用设置为"无"是不够的。VBA 编码人员很容易忘记这一点,他们可能会认为将对象设置为"什么都不够"。

有什么方法可以从 C# 的角度解决这个问题,还是必须坚持使用显式 Dispose?

你说你实现了处置模式,但你是否实现了完整的模式,而不仅仅是公共Dispose方法,特别是带有终结器的方法,例如类似于下面的东西?

~ComplexResourceHolder(){  
Dispose(false);  
}

释放模式

请注意,这仍然是不确定的;终结器的运行时间可能比 VBA 使用者将其设置为Nothing的时间晚得多,但至少它最终会释放对象。如果您必须有一个确定性版本,那么我们需要重新考虑该方法。

一个可能但简单的选项可以简化操作,即仅引用每个公共方法中的第三方 COM 组件,并在最后释放它。只要典型用法通常不会在同一对象上连续调用多个方法,这可能有效。

另一个简单的选项是允许 VBA 使用者将第三方 COM 对象分配给托管对象,以便 VBA 可以管理该组件的生存期,而不是 .NET。

可能还有其他选择,但它们的实施将非常具有挑战性,并且不会那么万无一失。

最新更新