C#.Net4:正确处理(动态)COM对象

时间:2011-02-28 10:25:50

标签: c# .net com com-interop

我需要从我的.Net4应用程序自动化办公文档(Word& Excel)。

由于我无法强制我的用户使用特定的Office版本,因此我不使用互操作程序集或tlbimp,因此我的项目不包含任何其他引用,如果未安装Office,整个应用程序也将失败(功能将无法使用。)

相反,我问系统哪个COM服务器可以处理“Word.Application”或“Excel.Application”:

dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
app.Foo();

我担心如何在完成后正确处理“app”对象,因为现在我有两个内部管理系统需要担心(COM引用计数和.Net引用跟踪)。理想情况下,我应该能够将动态app对象包装到一次性包装器类中,并确保在处理包装器时未引用底层COM对象。

编辑:我还想知道当我完成它时如何正确地使COM对象“生效”,因为Word处于一个单独的进程中。我应该能够实例化Word应用程序,自动化它,然后释放我的所有引用,但Word应用程序应保持打开状态。

1 个答案:

答案 0 :(得分:8)

我绝对会实施IDisposable并在其中调用Marshal.ReleaseComObject。确保correctly implement the disposable pattern避免多次释放COM对象并进一步减少引用计数,尽管如果您只打算创建一个COM对象实例,这可能无关紧要。我过去成功地实现了这种模式,所以你肯定会朝着正确的方向前进。

认为即使最后一个COM对象在您的应用中被引用计数为0,Word也将保持打开状态,除非您明确要求退出。 (Word.Application.Close()?)