使COM可见.NET程序集释放COM引用

时间:2018-03-06 23:34:36

标签: c# .net vba com

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

@echo off
SET x=0
for %%I in (*) do(
SET /a x+=1
REN %%I %x%
)
pause

我尝试在managedObject中实现IDisposable模式并显式释放COM对象。这工作,但我仍然必须从VBA显式调用Dispose方法。仅仅将对managedObject的引用设置为Nothing是不够的。这很容易被VBA编码人员遗忘,他们可能会假设将对象设置为Nothing就足够了。

有什么方法可以从C#角度编写代码,还是我必须坚持使用显式的Dispose?

1 个答案:

答案 0 :(得分:-1)

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

~ComplexResourceHolder(){  
    Dispose(false);  
}

Dispose pattern

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

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

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

可能还有其他选择,但实施起来非常具有挑战性,并且不会万无一失。