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

Bor*_* B. 9 .net c# com com-interop

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

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

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

dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
app.Foo();
Run Code Online (Sandbox Code Playgroud)

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

编辑:此外,我想知道当我完成它时如何正确地使COM对象"活着",因为Word是在一个单独的过程中.我应该能够实例化Word应用程序,自动化它,然后释放我的所有引用,但Word应用程序应该保持打开状态.

Jam*_*ter 8

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

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