【发布时间】:2019-06-27 11:40:14
【问题描述】:
我正在开发一个操作 Word 应用程序的 Windows 应用程序。更具体地说,我正在打开一个 Word 文档,但是当我退出它并尝试打开另一个 Word 文档时,会出现此错误。
如何处理
System.Runtime.InteropServices.COMException (0x800706BA):RPC 服务器不可用。 (来自 HRESULT 的异常:0x800706BA)在 Microsoft.Office、Word.ApplicationClass.set_Visible(Boolean Prop)**
如果我不退出 Word 应用程序,则不会出现此错误。
下面我将向您展示我打开和退出 Word 应用程序的功能。
//function to open word Document located in a specific path
public static void openWordDocument(string fileName)
{
try
{
wordApplication.Visible = true;
string filePath = myPath + fileName;
WordApi.Document docx = wordApplication.Documents.Open(filePath);
}
catch (Exception ex)
{
MyLogger.Error(ex.ToString());
}
}
//function to quit wordApplication
public static void CloseWordApp() {
try {
Object wordAppObject = Marshal.GetActiveObject("Word.Application");
WordApi.Application wordApp = (WordApi.Application)wordAppObject; //cast Object to its actual type
wordApp.Quit();
}
catch (Exception ex) {
MyLogger.Error(ex.ToString());
}
【问题讨论】:
-
当你有完美的
wordApplication字段时,你为什么要为Word.Application使用ROT?此外,您最终可能会得到错误的实例。只需使用该字段并执行wordApplication.Quit(); wordApplication = null;。我不会担心你提到的最后一个链接,在这里看不到它是如何应用的 -
没有用。仍然得到完全相同的错误。 @MickyD
-
想想你在语句中描述的顺序:“我正在打开一个 Word 文档,但是当我退出它并尝试打开另一个 Word 文档时,就会出现此错误。”我解释您的序列的方式是您尝试使用 已关闭 Word 应用程序打开一个新文档。同样对
static实例执行此操作是自找麻烦,因为除非您专门为这些实例清空,否则它们没有资格让 GC 收集和释放底层 COM 引用。 -
等等,你在哪里初始化
wordApplication??在代码的一部分中,您使用的是一个字段,而另一部分是 ROT。退出 Word 时,需要将wordApplication设置为null。您需要稍后重新创建它才能使用它 -
顺便说一句,你可以使用
dynamic变量与COM而不是强制转换;必须知道类型;或添加对互操作和/或 COM 库的引用。虽然你不会得到 IntelliSense
标签: c# winforms office-interop comexception