我正在使用 Visual Studio 进行 Office 开发。并收到以下错误
Error:
**
Unable to cast COM object of type 'Microsoft.Office.Interop.Word.ApplicationClass' to interface type 'Microsoft.Office.Interop.Word._Application'.
This operation failed because the QueryInterface call on the COM component for the interface with IID '{00020970-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
**
代码:(也位于https://gist.github.com/1056809)
if (File.Exists((string)strDocPath))
{
Word.Application wdApp = new Word.Application();
wdApp.Visible = true; //Error thrown here
object readOnly = false;
object isVisible = true;
object oMissing = System.Reflection.Missing.Value;
//Open the word document
//Error thrown on line below.
Word.Document aDoc = wdApp.Documents.Open(ref strDocPath, ref oMissing, ref readOnly, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref isVisible,
ref oMissing, ref oMissing, ref oMissing, ref oMissing);
// Activate the document
aDoc.Activate();
}
这个错误是什么? 我怎样才能避免它?
问题是HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID{000209FF-0000-0000-C000-000000000046}无法注册。 尽管该类 (Microsoft.Office.Interop.Word.ApplicationClass) 存在于您的注册表中,但这并不意味着它已被注册。由于某些无法解释的原因,Microsoft 不允许注册 Microsoft.Office.Interop.Word.dll,因此,如果您在代码中引用“ApplicationClass”类;当部署到实际服务器时你会遇到这个问题。您不会在本地/构建计算机上收到错误消息/警告。 一般错误可能如下所示:
检索具有 CLSID 的组件的 COM 类工厂 由于以下原因,{000209FF-0000-0000-C000-000000000046} 失败 错误:80040154 类未注册(HRESULT 异常: 0x80040154(REGDB_E_CLASSNOTREG))。
结论: 即使您已安装/激活并获得 Microsoft Office 2007/2010 的许可。无法注册“Microsoft.Office.Interop.Word.dll”dll。我花了几乎整整一周的时间才弄清楚这一点。注意:亲自查看;下载-安装-运行“RegDllView”。您可以看到“WINWORD.EXE”的所有已注册 DLL。请注意,不会显示 {000209FF-0000-0000-C000-000000000046}。即使尝试使用该程序手动注册“Microsoft.Office.Interop.Word.dll”也会失败,并显示错误代码 127。我相信解决方法实际上是使用 Microsoft.Office 中提供的“文档”界面。 Interop.Word.dll。它只是 WINWORD.EXE 的包装。
尝试将 if 语句后的第一行替换为如下内容:
Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
然后确保添加对“Microsoft Word 12.0 Object Library”COM 对象的引用,该对象在解决方案资源管理器中看起来像“Microsoft.Office.Interop.Word”。
我对此进行了测试,出现了一个空白的 MS Word 应用程序。所以让我们看看我们是否能走到这一步。
我知道这有点“过期”,但有些人可能仍然难以找到一个简单的解决方案(就像我自己一样),因此我的回复。
根据 @Marine_Elite 帖子,该类未正确注册,但有一个解决方法(我认为)比围绕 WINWORD.EXE 编写自定义包装器容易得多。
我使用了here中的示例并将其应用于MSWORD.OLB
简而言之,您可能只需要下载 regtlibv12.exe 并针对上述 OLB 运行它,但强烈建议遵循所提供链接中的所有步骤。
我使用的最后一个命令是:
regtlibv12.exe "C:\Program Files\Microsoft Office\root\Office16\MSWORD.OLB"
从那时起,我的代码运行得很好,尽管我不确定应用程序在不同的主机上,甚至在重新启动后在我自己的机器上将如何表现。不过,在后一种情况下可能出现的潜在问题中,再次注册 OLB 是一个简单的解决方案。
此代码对我有用:
openFileDialog1.InitialDirectory = @"D:\Desktop";
openFileDialog1.RestoreDirectory = true;
openFileDialog1.Title = "Browse Text Files";
openFileDialog1.Filter = "MS Words Documents (*.docx,*.doc)|*.docx;*.doc|All files (*.*)|*.*";
openFileDialog1.FilterIndex =1;
openFileDialog1.ShowDialog();
object strDocPath = openFileDialog1.FileName;
if (File.Exists((string)strDocPath))
{
Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
wdApp.Visible = true; //Error thrown here
object readOnly = false;
object isVisible = true;
object oMissing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.Document aDoc = wdApp.Documents.Open(ref strDocPath, ref oMissing, ref readOnly, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref isVisible,
ref oMissing, ref oMissing, ref oMissing, ref oMissing);
aDoc.Activate();
}