Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#.Net4:正确处理(动态)COM对象_C#_.net_Com_Com Interop - Fatal编程技术网

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

C#.Net4:正确处理(动态)COM对象,c#,.net,com,com-interop,C#,.net,Com,Com Interop,我需要从.Net4应用程序中自动生成office文档(Word和Excel) 由于我无法真正强制用户使用特定的Office版本,因此我不使用interop程序集或tlbimp,因此我的项目不包含任何其他引用,如果未安装Office,整个应用程序也不会失败(功能将不可用) 相反,我询问系统哪个COM服务器可以处理“Word.Application”或“Excel.Application”: 我关心的是如何在处理完“app”对象后正确地处理它,因为现在我有两个内部管理系统需要担心(COM引用计数和.

我需要从.Net4应用程序中自动生成office文档(Word和Excel)

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

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

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


编辑:我还想知道当我处理完COM对象后,如何正确地使它“继续运行”,因为Word是在一个单独的进程中。我应该能够实例化Word app,将其自动化,然后释放所有引用,但Word app应该保持打开状态。

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


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

可能的重复:不一定,重复的候选者更多的是关于C#中COM的实例化方面,这个问题是关于处理的。确保您也处理任何中间COM对象-因此在您链接的示例中,我应该替换Marshal.FreeHGlobal(nativeResource)与Marshal.ReleaseComObject(应用程序)一起?就这样?当然,您不需要在它周围使用if()块,managedResource的内容可能与您的用例无关,但是如果不是这样的话,应该可以正确地清理您的COM引用。我建议不要在代码中到处传递IDisposable包装,以尽量减少系统对该特定IDisposable的暴露。
dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
app.Foo();