【发布时间】:2018-01-26 14:45:45
【问题描述】:
我们的一些客户从 Office 2013 降级到 Office 2010。
执行此操作后,如果您调用应用程序属性 ComAddins,则会收到以下异常:
System.Runtime.InteropServices.COMException (0x8002801D): Library not registered. (Excepción de HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))
at Microsoft.Office.Interop.Word.ApplicationClass.get_COMAddIns()
at our own code
我们尝试重新安装 Office 并进行了不同的清理,但均无济于事。关于注册表出了什么问题或如何修复它的任何想法?
我们能否找到错误的注册并以某种方式修复它?
编辑:
这是一个在普通机器上工作的示例,在降级机器上失败:
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;
namespace WordCorruptionTester
{
public static class Program
{
public static void Main()
{
Application application = null;
try
{
application = new Application();
COMAddIns addins = application.COMAddIns;
File.WriteAllText(@"c:\appAgn\office.txt", "OK");
Marshal.ReleaseComObject(addins);
Marshal.ReleaseComObject(application);
}
catch
{
File.WriteAllText(@"c:\appAgn\office.txt", "CORRUPTO");
if (application != null)
{
Marshal.ReleaseComObject(application);
}
}
}
}
}
继续:
以下是收集到的新信息的一些真正有效的 cmets:
@Dirk Vollmar:执行 winword /r 没有区别。
@TnTinMn:长话短说。按照您的建议,我没有发现任何问题,但我
看到接口指向的文件是 winword.olb 所以我用"C:\Windows\Microsoft.NET\Framework\v4.0.30319>regtlibv12.exe "C:\Program Files (x86)\Microsoft Office\Office14\MSWORD.OLB"" 重新注册了它,因为错误是关于库未注册。执行此操作后,错误消息更改为:
System.Runtime.InteropServices.COMException (0x80040155): Interface not registered (Excepción de HRESULT: 0x80040155)
at Microsoft.Office.Interop.Word.ApplicationClass.get_COMAddIns()
at our own code
进一步调查后,我反编译了我们自己调用 get_COMAddIns 的代码,发现嵌入了名为“000C0339-0000-0000-C000-000000000046”的接口 ID
【问题讨论】:
-
你是如何声明应用程序对象的?它的类型是
Word.Application还是Word.ApplicationClass?我怀疑它是“类”类型,并且代码被编译为使用 GAC 中的 Office PIA,而不是嵌入互操作类型。 -
@TnTinMn:我添加了一些概念证明,我们不使用 ApplicationClass :\
-
我们拥有所有信息,是要设置为嵌入的 Word 引用还是引用 PIA 的。在解决方案资源管理器中,右键单击
Interop.Microsoft.Office.Interop.Word并选择属性。 “嵌入互操作类型”的价值是什么? -
你是根据 2013 年的类型库构建的吗?或者,互操作程序集是针对 2013 而不是 2010 构建的?使用进程监视器找出正在注册表中查找的类型库。确保它在那里。在机器上查找 Word.Application clsid,然后从那里查看类型库,然后查找类型库,尤其是它的路径。
-
只是猜测,但请检查注册表项
Computer\HKEY_CLASSES_ROOT\Wow6432Node\Interface\{00020970-0000-0000-C000-000000000046}\TypeLib。注意那里列出的“版本”。复制“默认”字段中的 GUID 左值。在 Keys 中搜索该 GUID;它应该在Computer\HKEY_CLASSES_ROOT\TypeLib\{the GUID value}. Inspect the sub keyVersion Number\0\Win32`;查看“默认”字段中列出的文件路径。该路径可能指向 2013 年类型库。
标签: c# .net ms-word com ms-office