排查 Office 解决方案中的问题

适用于: Visual Studio

本文介绍如何排查在 Visual Studio 中开发 Office 解决方案时执行不同任务时可能会遇到的问题。

创建、升级和打开项目时出现的问题

创建或打开 Office 项目时,可能会遇到以下问题。

问题 1:无法创建项目

如果尝试创建或打开 Office 项目时发生错误,但 Visual Studio 没有足够的信息来确定原因,请尝试关闭项目,退出 Visual Studio,然后重新开始。

如果尝试创建文档级项目,则可能是在 Excel 或 Word 中打开与新项目中文档同名的另一个文档。 请确保 Excel 或 Word 的所有其他实例均已关闭。

问题 2:基于现有项目中的文档创建新项目时,控件属性会丢失

如果基于现有项目中的文档创建新的 Office 项目,则文档上的任何控件的属性不会复制到新项目中。 手动重置任何预先存在的控件的属性。 或者,可以通过以下方法保留控件属性:创建现有项目的副本(而不是创建新项目);或者将现有项目加载到新解决方案(在设计器中),然后将控件从现有文档复制并粘贴到新文档中。

问题 3:基于现有工作簿创建 Excel 工作簿项目时出错

如果基于现有工作簿创建新的 Excel 工作簿项目,则可能会看到以下错误的组合。

  • 来自 Excel:“隐私问题警告: 此文档中包含宏、ActiveX 控件、XML 扩展包信息或 Web 组件。 其中可能包含个人信息,并且这些信息不能通过“文档检查器”删除。”
  • 来自 Visual Studio:“设计器未能正确加载。”

如果尝试创建的项目基于其个人信息已使用文档检查器删除的工作簿,则可能会发生这些错误。 若要避免此问题,请在创建项目之前执行以下步骤:

  1. 在 Excel 中打开工作簿。
  2. 在 Excel 中打开“信任中心”。
  3. 在“隐私选项”选项卡上,清除“保存时从文件属性中删除个人信息”复选框。
  4. 保存工作簿并关闭 Excel。

问题 4:迁移后无法打开项目

将 Office 解决方案迁移到 Microsoft 办公室 2010 后,无法在仅安装了 2007 Microsoft 办公室 系统的开发计算机上打开该项目。 可以会出现下列错误。

  • “解决方案中的一个或多个项目未能正确加载。 请参阅输出窗口获取有关的详细信息。”
  • “无法创建项目,因为此计算机上未安装与此项目类型关联的应用程序。 必须安装与此项目类型关联的 Microsoft Office 应用程序。”

若要解决此问题,请编辑 .vbproj.csproj 文件。 对于 Word 项目,请替换为 HostPackage="{763FDC83-64E5-4651-AC9B-28C4FEB985A1}" HostPackage="{6CE98B71-D55A-4305-87A8-0D6E368D9600}"。 对于 Excel 项目,请替换为 HostPackage="{B284B16A-C42C-4438-BDCD-B72F4AC43CFB}" HostPackage="{825100CF-0BA7-47EA-A084-DCF3308DAF74}"。 对于 Outlook 项目,请替换为 HostPackage="{D2B20FF5-A6E5-47E1-90E8-463C6860CB05}" HostPackage="{20A848B8-E01F-4801-962E-25DB0FF57389}"

或者,确保仅在安装了 Microsoft Office 2010 的开发计算机上打开迁移的项目。

问题 5:升级后的 Office 2003 文档级项目中包含Windows 窗体控件的错误

如果升级 Microsoft 办公室 2003 文档级项目,并且该文档包含Windows 窗体控件,则升级后的项目可能存在编译或运行时错误。 若要避免此问题,请在升级项目之前在开发计算机上安装 Visual Studio 2005 Tools for Office Second Edition Runtime。 可以从 Microsoft 下载中心(网址为: Microsoft Visual Studio 2005 Tools for Office Second Edition Runtime (VSTO 2005 SE) (x86))下载此版本的运行时作为可再发行组件包。

升级项目后,如果任何其他 Office 解决方案未使用 Visual Studio 2005 Tools for Office Second Edition Runtime,则可以从开发计算机中卸载它。

使用设计器时出现的问题

在文档级项目中处理文档、工作簿或工作表设计器时,可能会遇到以下问题。

问题 1:设计器无法正确加载

在以下情况下,Visual Studio 无法打开设计器:

  • Excel 或 Word 已打开且显示模式对话框。 若要打开设计器,请查看 Excel 或 Word 是否有已打开的模式对话框,然后关闭所有打开的模式对话框。 如果没有打开的模式对话框,则可能需要先执行一些其他操作 Excel 或 Word 才可做出响应。
  • 当前正在调试项目。 若要打开设计器,请停止或完成调试。
  • Excel 启动时,开发计算机上安装的某个 Excel VSTO 外接程序正在显示一个对话框。 若要创建 Excel 文档级项目,则必须首先禁用该 VSTO 外接程序。

问题 2:控件在文档或工作表上显示为黑色矩形

如果对文档或工作表中的控件进行分组,则 Visual Studio 不再识别这些控件。 无法在“属性”窗口中访问分组控件,它们显示为文档或工作表上的黑色矩形。 若要还原控件的功能,必须取消对控件进行分组。

问题 3:Word 模板上的控件在 Visual Studio 中不可见

如果在 Visual Studio 设计器中打开 Word 模板,则与文本不一致的模板上的控件可能不可见。 这是因为 Visual Studio 在 普通 视图中打开 Word 模板。 若要查看控件,请选择“视图”菜单,指向“Word 视图”Microsoft 办公室,然后选择“打印版式”。

问题 4:插入剪贴画命令在 Visual Studio 设计器中不执行任何操作

当 Excel 或 Word 在 Visual Studio 设计器中打开时,单击功能区“插图”选项卡上的“剪贴画”按钮不会打开剪贴画任务窗格。 若要添加剪贴画,必须在 Visual Studio 外部打开主项目文件夹(而不是 \bin 文件夹中的副本)中的工作簿或文档的副本,添加剪贴画,然后保存工作簿或文档。

编写代码时出现的问题

在 Office 项目中编写代码时,可能会遇到以下问题。

问题 1:使用 C 时无法访问 Office 对象的某些事件#

在某些情况下,当你尝试在 Visual C# 项目中访问 Office 主互操作程序集 (PIA) 类型的实例的特定事件时,可能会看到类似于以下形式的编译器错误。

“Microsoft.Office.Interop.Excel._Application.NewWorkbook”和“Microsoft.Office.Interop.Excel.AppEvents_Event.NewWorkbook”之间的歧义性

此错误意味着你尝试访问与对象的另一个属性或方法同名的事件。 若要访问事件,必须将对象强制转换为其 事件接口

具有事件的 Office PIA 类型实现两种接口:核心接口和事件接口;前者包含所有属性和方法,后者则包含由对象公开的事件。 这些事件接口使用命名约定 _<objectname>Events n>事件<,例如AppEvents_Event和 。ApplicationEvents2_Event 如果无法访问预期在对象上查找的事件,请将该对象强制转换为其事件接口。

例如,Application 对象具有一个NewWorkbook 事件和一个 NewWorkbook 属性。 若要处理 NewWorkbook 事件,请将 Application 强制转换为 AppEvents_Event 接口。 下面的代码示例演示了如何在 Excel 的文档级项目中进行此操作。

private void ThisWorkbook_Startup(object sender, System.EventArgs e)
{
    ((Excel.AppEvents_Event)this.Application).NewWorkbook += 
        new Excel.AppEvents_NewWorkbookEventHandler(ThisWorkbook_NewWorkbook);
}

void ThisWorkbook_NewWorkbook(Excel.Workbook Wb)
{
    // Perform some work here.
}

有关 Office PIA 中的事件接口的详细信息,请参阅 Office 主互操作程序集中的类和接口概述。

问题 2:无法在面向 .NET Framework 4 或 .NET Framework 4.5 的项目中引用 Office PIA 类

在面向 .NET Framework 4 或 .NET Framework 4.5 的项目中,引用 Office PIA 中定义的类的代码默认情况下不会编译。 PIA 中的类使用命名约定 <对象名称>类,例如 DocumentClassWorkbookClass。 例如,Word VSTO 外接程序项目中的以下代码不会编译。

Word.DocumentClass document = (Word.DocumentClass) Globals.ThisAddIn.Application.ActiveDocument;

此代码将导致以下编译错误:

  • Visual Basic:“使用 No-PIA 模式链接类”DocumentClass“时,不允许引用类'DocumentClass'。
  • Visual C#:“无法嵌入互操作类型”Microsoft.Office.Interop.Word.DocumentClass”。 请改用适用的接口。”

若要解决此错误,请修改代码以改为引用相应的接口。 例如,应引用 Document 接口的实例,而不是引用 DocumentClass 对象。

Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;

面向 .NET Framework 4 或 .NET Framework 4.5 的项目默认自动嵌入 Office PIA 中的所有互操作类型。 发生此编译错误的原因是嵌入互操作类型功能仅适用于接口,而不适用于类。 有关 Office PIA 中的接口和类的详细信息,请参阅 Office 主互操作程序集中的类和接口概述。 有关 Office 项目中嵌入的互操作类型功能的详细信息,请参阅 设计和创建 Office 解决方案

问题 3:无法识别对 Office 类的引用

某些类名(例如 Application)位于多个命名空间中,例如 Microsoft.Office.Interop.WordSystem.Windows.Forms。 因此,项目模板顶部的 Imports/using 语句包括速记限定常量,例如:

using Word = Microsoft.Office.Interop.Word;

使用 Imports/using 语句需要使用 Word 或 Excel 限定符区分对 Office 类的引用,例如:

Word.Document doc;

如果使用非限定声明,则会收到错误,例如:

Document doc;  // Class is ambiguous

即使已导入 Word 或 Excel 命名空间并有权访问其中的所有类,但必须使用 Word 或 Excel 完全限定所有类型才能删除命名空间歧义。

生成项目时出现的问题

生成 Office 项目时可能会遇到以下问题。

问题 1:无法生成基于具有受限权限的文档的文档级项目

如果文档具有受限权限,Visual Studio 将无法生成文档级项目。 如果项目包含具有受限权限的文档,则项目不会编译,你将在 “错误列表 ”窗口中收到以下消息。

无法添加自定义项。

如果要包括具有受限权限的文档,请在开发和生成解决方案时使用无限制的文档。 然后,在发布解决方案之后对发布位置中的文档应用受限权限。

问题 2:删除 NamedRange 控件后发生编译器错误

如果从设计器中不是活动工作表的工作表中删除控件 NamedRange ,则可能不会从项目中删除自动生成的代码,并且可能会发生编译器错误。 为了确保删除这些代码,应在删除 NamedRange 控件前总是选中包含该控件的工作表,使其成为活动工作表。 如果在删除控件时未删除自动生成的代码,则可能会导致设计器通过激活工作表并进行更改来删除代码,以便工作表标记为已修改。 重新生成项目时,将删除这些代码。

调试项目时出现的问题

调试 Office 项目时可能会遇到以下问题。

问题 1:在开发计算机上发布和安装解决方案时出现卸载提示

调试 Office 解决方案时,可能会出现以下错误。

无法安装自定义项,因为当前安装了另一个版本,并且无法从此位置升级。

此错误表示之前已在开发计算机上发布并安装了 Office 解决方案。 若要避免出现此消息,请在调试解决方案之前从计算机上的已安装程序列表中卸载该解决方案。 或者,可以在开发计算机上创建另一个用户帐户以测试已发布解决方案的安装。

问题 2:在 UNC 网络位置创建的文档级项目不会从 Visual Studio 运行

如果在 UNC 网络位置为 Excel 或 Word 创建文档级项目,则必须将文档的位置添加到 Excel 或 Word 中的受信任位置列表中。 否则,尝试在 Visual Studio 中运行或调试项目时,不会加载自定义项。 有关受信任位置的详细信息,请参阅 授予对文档的信任。

问题 3:调试后线程未正确停止

Visual Studio 中的 Office 项目遵循能够使调试器正确关闭程序的线程命名约定。 如果在解决方案中创建线程,则应使用前缀 VSTA_ 为每个线程命名,以确保在停止调试时会正确处理这些线程。 例如,可以设置 Name 等待网络事件 VSTA_NetworkListener的线程的属性。

问题 4:无法在开发计算机上运行或调试任何 Office 解决方案

如果无法在开发计算机上运行或开发 Office 项目,可能会看到以下错误消息。

无法加载自定义,因为无法创建应用程序域。

在加载 Office 解决方案之前,Visual Studio 使用 Fusion(.NET Framework 程序集加载程序)来缓存程序集。 请确保 Visual Studio 可以写入 Fusion 缓存,然后重试。 有关详细信息,请参阅 影子复制程序集

问题 5:使用“编辑并继续”后停止文档级项目中的调试器时出错

如果在项目处于中断模式时使用“编辑并继续更改 Excel 或 Word 的文档级项目中的代码,则在停止调试器时,可能会看到一个对话框,其中包含以下错误消息。

终止处于当前状态的进程可能会导致意外结果,包括数据丢失和系统不稳定。

无论是在对话框中选择 “是 ”还是 “否 ”,Visual Studio 都终止 Excel 或 Word 进程并停止调试器。 若要停止调试项目而不显示此对话框,请直接退出 Excel 或 Word,而不是在 Visual Studio 中停止调试器。

参考