Office 解决方案中运行时错误的疑难解答

更新:2010 年 9 月

在运行时使用在 Visual Studio 中创建的 Office 解决方案执行以下任务时可能会遇到问题:

  • 安装解决方案

  • 加载或运行解决方案

  • 在解决方案中使用特定属性、方法和事件

  • 自定义 UI

  • 将数据绑定到控件和缓存数据

  • 使用 ServerDocument 类

安装解决方案

Visual Studio Tools for Office Runtime 针对安装或卸载 Office 解决方案时引发的所有异常,将消息写入 Windows 中的事件查看器。 可以使用这些消息来解决安装和部署问题。 有关更多信息,请参见 Office 解决方案的事件日志

安装 Office 解决方案时,可能会遇到以下错误。

使用“COM 外接程序”对话框无法安装外接程序

如果使用 Office 应用程序中的**“COM 外接程序”**对话框安装使用 Visual Studio 中的 Office 开发人员工具创建的外接程序,可能会显示以下错误。

“外接程序名称.dll 不是有效的 Office 外接程序。”

不能使用**“COM 外接程序”**对话框安装使用 Visual Studio 中的 Office 开发人员工具创建的外接程序。 而应执行以下操作之一:

  • 如果要尝试在开发计算机上运行外接程序,请生成项目,然后启动 Office 应用程序。 外接程序应自动加载。 或者,在 Visual Studio 中的**“调试”菜单上单击“开始执行(不调试)”**。 有关更多信息,请参见 Office 解决方案生成过程概述

  • 如果要尝试在开发计算机上调试外接程序,请按 F5 或在 Visual Studio 中的**“调试”菜单上单击“启动调试”**。 有关更多信息,请参见在应用程序级项目中进行调试

  • 如果要尝试在最终用户计算机上安装外接程序,请使用 ClickOnce 或 Windows Installer 来部署外接程序。 有关更多信息,请参见部署 Office 解决方案

解决方案成功安装,但在事件查看器中报告 FrameworkVersionMismatchException

安装使用 Visual Studio 创建的 Office 解决方案时,可能会在事件查看器中显示一个错误,指示所引发的 Microsoft.VisualStudio.Tools.Applications.Deloyment.FrameworkVersionMismatchException。 此异常并不表示实际的解决方案错误,通常可以忽略它。

此异常是在安装有 .NET Framework 3.5 和 .NET Framework 4 的计算机上安装面向 .NET Framework 4 的 Office 解决方案时由 Visual Studio Tools for Office Runtime 在内部引发和捕获的。 Visual Studio Tools for Office Runtime 使用此异常来确定哪个版本的公共语言运行时 (CLR) 可用于加载解决方案。

加载或运行解决方案

Visual Studio Tools for Office Runtime 可将启动过程中发生的所有错误写入日志文件中,或者在消息框中显示每个错误。 默认情况下,这些选项是禁用的。 可以通过创建环境变量来启用这些选项。 有关更多信息,请参见在文档级项目中进行调试在应用程序级项目中进行调试

加载或运行 Office 解决方案时,可能会遇到以下错误。

未能加载公共语言运行时或 Microsoft .NET Framework

最终用户的计算机必须安装有解决方案所面向的 .NET Framework 版本。 有关 Office 解决方案可面向的 .NET Framework 版本的更多信息,请参见设计和创建 Office 解决方案

无法找到或加载程序集

此问题会导致显示以下错误消息。

“无法找到或无法加载自定义程序集。 您仍可以编辑和保存文档。 请与管理员或此文档的作者联系,以获得进一步的帮助。”

若要解决此错误,请尝试以下方法:

  • 检查用户是否能够访问程序集位置,并检查指定的程序集是否存在。 有关更多信息,请参见 Office 解决方案中的程序集概述

  • 如果存在该程序集,请检查 Word 或 Excel 所运行的自定义项(如外接程序、智能标记或智能文档)是否显式加载了 .NET Framework 1.1。 若要解决此问题,请禁用任何显式加载 .NET Framework 1.1 的自定义项。 不能在使用更高版本 .NET Framework 的同一应用程序进程中加载此版本的 .NET Framework。 有关更多信息,请参见进程内并行执行

    提示

    在 Excel 2010 和 Word 2010 中已弃用智能标记。 有关更多信息,请参见智能标记概述

  • 检查自定义项程序集中是否有未经处理的异常正在阻止程序集加载。 将调试器设置为在遇到公共语言运行时异常时中断,或者在**“选项”对话框中选择“当异常跨越 AppDomain 或托管/本机边界时中断”**选项,调试解决方案。 有关更多信息,请参见如何:处理 Office 项目中的错误

  • 您可以通过设置环境变量来获取附加的疑难解答信息,这些变量可使 Visual Studio Tools for Office Runtime显示详细的错误消息并将所有操作写入日志文件。 有关更多信息,请参见在文档级项目中进行调试在应用程序级项目中进行调试

外接程序未加载或被禁用

如果应用程序级外接程序未正确加载,则需要检查以下几种可能性:

  • 如果 Microsoft Office 应用程序意外退出,或在外接程序初始化时发生错误,则应用程序可能会禁用该外接程序。 有关更多信息,请参见如何:重新启用已禁用的外接程序

  • Microsoft Office 应用程序可能正在运行显式加载了 .NET Framework 1.1 的外接程序。 若要解决此问题,请禁用任何显式加载 .NET Framework 1.1 的外接程序。 不能在使用更高版本 .NET Framework 的同一应用程序进程中加载此版本的 .NET Framework。 有关更多信息,请参见进程内并行执行

  • 您可以通过设置环境变量来获取附加的疑难解答信息,这些变量可使 Visual Studio Tools for Office Runtime显示详细的错误消息并将所有操作写入日志文件。 有关更多信息,请参见在应用程序级项目中进行调试

无法加载类型

此问题导致显示以下错误消息:

“未能从程序集 程序集名称 加载类型 项目名称。”

如果您对 Office 项目中的代码进行模糊处理,可能显示此消息。 对代码进行模糊处理会更改所有类的名称。 但是,在清单中却引用了原始类名称,并且模糊处理程序没有更改清单。

若要避免此错误,请将项目中已生成类的名称添加到模糊处理程序的不重命名的类列表中。

Office 文档打开时没有错误,但不执行代码

代码不运行同时也不显示错误消息的原因包括:

  • Office 主互操作程序集 (PIA) 没有安装在全局程序集缓存中,可能是因为该计算机上没有安装 .NET Framework,或 Office 安装期间未安装 PIA。

  • 在同一台计算机上的 Visual Studio 中打开 Word 文档项目。 关闭 Visual Studio 并重新打开文档。

有关更多信息,请参见在文档级项目中进行调试

在解决方案中使用特定属性、方法和事件

您可能会遇到与 Microsoft Office 主互操作程序集 (PIA) 和 Visual Studio Tools for Office Runtime 中的特定属性、方法和事件相关的以下问题。

在 Word 中打开文档时未引发 DocumentChange 事件

活动文档更改时会引发 DocumentChange 事件。 打开文档时往往也会引发该事件。 但是,由于 Word 打开文档的方式有许多种(例如从命令行、Windows 资源管理器或从 Word 的“文件”菜单打开),所以打开文档时并不总会引发 DocumentChange 事件。 当文档打开后活动文档发生更换时,总会引发该事件。 如果您希望在打开文档时执行一些操作,请使用 Startup 事件。

Excel 事件在 Internet Explorer 中引发与在 Excel 中引发不同

如果 Internet Explorer 内承载了一个工作簿,则事件的引发顺序与该工作簿在 Excel 中打开的顺序不同。 另外,某些事件会引发两次。 如果解决方案包含 Internet Explorer,请测试不同的事件顺序对解决方案的运行会产生什么样的影响。

从模板创建文档时未引发 New 事件

如果您使用命令提示打开 Word 模板并创建新文档,则必须使用 /z 开关才能引发 New 事件。 不要在 /z 后包含空格,否则 Word 将打开该模板进行编辑,而不是基于该模板创建新文档。 例如:winword.exe /z"mytemplate.dot"

这与使用 /t 开关类似,不同的是 /z 还会引发 New 事件。

打开 XML 工作表时未引发 Open 事件

如果您基于一个现有的非本机工作表(例如 Excel XML 格式)创建 Excel 项目,在打开该工作表时不会引发 Open 事件。

BeforeClose 方法已运行,但用户仍使工作簿保持打开状态

最终用户有可能会在调用了 BeforeClose 事件处理程序后取消工作簿的关闭操作并继续使用您的解决方案。 如果用户更改了一个工作表,然后在没有事先保存的情况下执行关闭工作簿的操作,这时就会出现这种可能。 此时 BeforeClose 事件处理程序已被调用,但是随后用户会看到一个对话框,其中有取消关闭操作的选项。

如果您在 BeforeClose 事件处理程序中加入关闭数据库连接或执行其他清理操作的代码,那么这些代码可能就会被调用,而用户仍然在使用您的解决方案。

设置“另存为”对话框的 Cancel 参数将返回不准确的警告或导致 Word 意外退出

如果在 DocumentBeforeSave 事件的事件处理程序内显示**“另存为”**对话框,并且将 Cancel 参数设置为 false,则应用程序可能会意外退出。 如果将 Cancel 参数设置为 true,则显示一条错误信息,指示 Autosave 已禁用。

Close 方法导致 Word 和 Excel 意外退出

当您从无模式窗体调用文档或工作簿的 Close 方法时,应用程序可能意外退出。 所有打开的文档或工作簿都将关闭,数据可能丢失。 如果 Microsoft Office Outlook 使用 Word 作为其电子邮件编辑器,所有打开的电子邮件也可能关闭。 如果在处理 AppDomain.DomainUnload 事件时显示 Windows 窗体或消息框,也可能出现这种情况。

若要避免此问题,请不要从无模式窗体或在无模式窗体的事件中调用 Close 方法。 请改用下列过程:

  • 如果必须从窗体关闭文档,请使用模式窗体(例如通过使用 ShowDialog,而不是 Show)。

  • 如果必须使用无模式窗体,在尝试关闭文档或工作簿之前,请确保无模式窗体已关闭,并且窗体引用已完全损坏。 下面的代码提供了一个示例。 若要使用此代码,请从 Word 文档级项目内的 ThisDocument 类运行该代码。

    Dim form1 As SampleForm
    
    Sub OpenForm()
        form1 = New SampleForm
        form1.Show()  ' Show the form modelessly.
    End Sub
    
    Sub ForceShutdown()
    
        ' Completely close the form if it is still running.
        ' Note that hiding the form might not work by itself.
    
        If (Not form1 Is Nothing) Then
            form1.Close()
            form1.Dispose()
            form1 = Nothing
        End If
    
        Me.Close()
    End Sub
    
    SampleForm form1;
    
    private void OpenForm()
    {
        form1 = new SampleForm();
        form1.Show();  // Show form modelessly.
    }
    
    private void ForceShutdown()
    {
        // Completely close the form if it is still running.
        // Note that hiding the form might not work by itself.
    
        if (form1 != null)
        {
            form1.Close();
            form1.Dispose();
            form1 = null;
        }
        object saveChanges = Word.WdSaveOptions.wdSaveChanges; 
        this.Close(ref saveChanges, ref missing, ref missing);
    }
    

有关在 C# 中传递参数 missing 的信息,请参见 Office 解决方案中的可选参数

将 Excel 宿主控件传递给方法时引发 InvalidCastException

Excel 中的某些方法和属性要求将本机 Office 对象传递给它们。 如果在面向 .NET Framework 3.5 的项目中将 Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute 特性设置为 false 且传入一个基于本机 Office 对象的宿主控件,则该项目会引发 InvalidCastException。 可以使用宿主控件的 InnerObject 属性将基础本机 Office 对象传递给这些方法和属性。 有关 Excel 中的本地化问题的更多信息,请参见 使用各种区域设置对 Excel 中的数据进行格式设置

自定义 UI

在 Office 解决方案中,可能会遇到与特定类型的 UI 自定义项相关的以下错误。

拆分 Excel 工作表窗口时 Windows 窗体控件出现不可预知的行为

如果拆分包含 Windows 窗体控件的工作表窗口,控件在两个窗口中的行为可能不一样。 例如,如果运行代码更改工作表上 TextBoxBackColor 属性,则该更改可能只显示在一个窗口中。

无法在 Outlook 外接程序中添加自定义属性页

如果 Outlook 外接程序为 Outlook 的**“选项”对话框或 Outlook 文件夹的“属性”**对话框创建了自定义属性页,则您必须显式使自定义属性页对 COM 可见(默认情况下,程序集对 COM 不可见)。 否则,外接程序创建自定义属性页将失败,同时您在调试外接程序时还可能收到 COMException

以下两种方式可以使自定义属性页对 COM 可见:

  • ComVisibleAttribute 添加到项目中实现自定义属性页的类。 有关将特性应用到类的更多信息,请参见 应用特性

  • 使用 Visual Studio 使整个外接程序程序集对 COM 可见。

    使用 Visual Studio 使外接程序程序集对 COM 可见

    1. 在 Visual Studio 中,在**“解决方案资源管理器”中右击您的项目,然后单击“属性”**。

    2. 单击**“应用程序”**选项卡。

    3. 单击**“程序集信息”**按钮。

    4. 选择**“使程序集 COM 可见”**复选框。

    5. 单击**“确定”**。

将数据绑定到控件和缓存数据

在使用数据绑定或缓存数据的 Office 解决方案中可能会遇到以下错误。

如果显示模式对话框,则 ListObject 的数据绑定将失败

如果在绑定到 ListObject 的数据集更新期间,Excel 显示模式对话框,则 ListObject 的数据绑定将失败。 当 ListObject 丢失数据绑定时,它将引发 DataBindingFailure 事件。 若要将 ListObject 再次绑定到数据源上,请处理 DataBindingFailure 事件,并调用 SetDataBinding 方法。

缓存的 Visual Basic 数据集名称在数据缓存中无法正确显示

使用 Visual Basic 创建的、被标记为 Cached 和 WithEvents 的 DataSet 对象(包括从**“数据源”窗口或“工具框”**拖出的、将 CacheInDocument 属性设置为 True 的 DataSet 对象)在缓存中的名称的前缀带下划线。 例如,如果创建 DataSet 并将其命名为 Customers,则缓存中的 CachedDataItem 名称将为 _Customers。 当使用 ServerDocument 访问此缓存项时,必须指定 _Customers 而不是 Customers。

使用 ServerDocument 类

在使用 Microsoft.VisualStudio.Tools.Applications.ServerDocument 类的 Office 解决方案中可能会遇到以下错误。

在仅安装了 Visual Studio 2010 Tools for Office Runtime 的计算机上无法运行使用 ServerDocument 的旧版应用程序

如果尝试在仅安装了 Visual Studio 2010 Tools for Office Runtime 的计算机上运行使用 Visual Studio Tools for Office system(3.0 版运行时) 中的 Microsoft.VisualStudio.Tools.Applications.ServerDocument 类的应用程序,则该应用程序可能会意外失败。 若要运行该应用程序,请在计算机上安装 Visual Studio Tools for Office system(3.0 版运行时)。 可在同一台计算机上安装这两个版本的运行时。

请参见

任务

Office 解决方案中设计时错误的疑难解答

Office 解决方案安全性疑难解答

概念

Office 解决方案部署疑难解答

其他资源

Office 解决方案的疑难解答

修订记录

日期

修订记录

原因

2010 年 9 月

增加了有关查看安装和加载错误的信息。

信息补充。

2010 年 5 月

增加了有关 FrameworkVersionMismatchException 的部分。

信息补充。