【问题标题】:Calling Word method Application.ComAddins crashes after downgrading from Office 2013 to Office 2010从 Office 2013 降级到 Office 2010 后调用 Word 方法 Application.ComAddins 崩溃
【发布时间】: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 key Version Number\0\Win32`;查看“默认”字段中列出的文件路径。该路径可能指向 2013 年类型库。

标签: c# .net ms-word com ms-office


【解决方案1】:

我终于通过这种方式解决了这个问题(从 Office 2013 降级到 Office 2010 时,它看起来像是一个影响办公自动化的 MS Office 安装程序错误):

"C:\Windows\Microsoft.NET\Framework\v4.0.30319>regtlibv12.exe "C:\Program Files (x86)\Microsoft Office\Office14\MSWORD.OLB""

"C:\Windows\Microsoft.NET\Framework\v4.0.30319>regtlibv12.exe "C:\Program Files (x86)\Common Files\Microsoft Shared\Office14\MSO.DLL""

此注册使系统再次运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2014-06-17
    • 2014-10-09
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多