Office 解决方案中错误的疑难解答
在 Visual Studio 中开发 Office 解决方案期间执行以下任务时可能会遇到问题:
创建、升级和打开项目
使用设计器
编写代码
生成项目
调试项目
创建、升级和打开项目
创建或打开 Office 项目时,可能会遇到以下错误。
无法创建项目
尝试创建或打开 Office 项目时出现错误,而 Visual Studio 没有足够的信息确定导致错误的原因。请尝试关闭项目,退出 Visual Studio,并再次启动。
如果尝试创建文档级项目,则可能是与新项目中的文档同名的另一个文档已在 Excel 或 Word 中打开。确保 Excel 或 Word 的所有其他实例都已关闭。
基于现有项目中的文档创建新项目时丢失控件属性
如果基于现有项目中的文档创建新 Office 项目,则不会将该文档中任何控件的属性复制到新项目中。必须为任何先前存在的控件手动重置其属性。或者,可以通过以下方法保留控件属性:创建现有项目的副本(而不是创建新项目);或者将现有项目加载到新解决方案(在设计器中),然后将控件从现有文档复制并粘贴到新文档中。
基于现有 Excel 工作簿创建 Excel 工作簿项目时出错
如果基于现有工作簿创建新 Excel 工作簿项目,则可能会显示以下错误组合。
来自 Excel:“隐私问题警告: 此文档中包含宏、ActiveX 控件、XML 扩展包信息或 Web 组件,其中可能包含个人信息,并且这些信息不能通过‘文档检查器’进行删除。”
来自 Visual Studio:“设计器未能正确加载。”
如果尝试创建的项目基于其个人信息已使用文档检查器移除的工作簿,则可能会发生这些错误。若要避免此错误,请在创建项目之前执行以下步骤:
在 Excel 中打开工作簿。
在 Excel 中打开信任中心。
在**“隐私选项”选项卡上,清除“保存时从文件属性中删除个人信息”**复选框。
保存工作簿并关闭 Excel。
迁移后无法打开项目
当 Office 解决方案迁移到 Microsoft Office 2010 后,不能在仅装有 2007 Microsoft Office system 的开发计算机上打开项目。您可能会看到以下错误。
“未能正确加载解决方案中的一个或多个项目。有关详细信息,请参见‘输出’窗口。”
“无法创建项目,因为此计算机上未安装与此项目类型关联的应用程序。必须安装与此项目类型关联的 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 的开发计算机上打开迁移的项目。
包含 Windows 窗体控件的已升级 Office 2003 文档级项目中出现错误
如果升级 Microsoft Office 2003 文档级项目,并且文档包含 Windows 窗体控件,则升级后的项目可能会发生编译或运行时错误。若要避免此问题,请在升级项目之前在开发计算机上安装 Visual Studio 2005 Tools for Office Second Edition 运行时。可从 Microsoft 下载中心的以下位置以可再发行组件包的形式获取此版本的运行时: Microsoft Visual Studio 2005 Tools for Office Second Edition 运行时 (VSTO 2005 SE) (x86)。
升级完项目后,如果任何其他 Office 解决方案都没有使用 Visual Studio 2005 Tools for Office Second Edition 运行时,则可以从开发计算机将该运行时卸载。
使用设计器
在文档级项目中使用文档、工作簿或工作表设计器时,可能会遇到以下错误。
设计器未能正确加载
在以下情况下,Visual Studio 无法打开设计器:
Excel 或 Word 已打开且显示模式对话框。若要打开设计器,请查看 Excel 或 Word 是否有已打开的模式对话框,然后关闭所有打开的模式对话框。如果没有打开的模式对话框,则 Excel 或 Word 作出响应之前可能需要执行一些其他操作。
当前正在调试项目。若要打开设计器,请停止或完成调试。
Excel 启动时,开发计算机上安装的某个 Excel 外接程序正在显示对话框。若要创建 Excel 文档级项目,则必须首先禁用该外接程序。
控件在文档或工作表中显示为黑色矩形
如果对文档或工作表中的控件进行分组,则 Visual Studio 将无法再识别这些控件。分组后的控件不能在**“属性”**窗口中访问,而且它们在文档或工作表中显示为黑色矩形。为了还原控件的功能,必须取消对控件进行分组。
Word 模板中的控件在 Visual Studio 中不可见
如果在 Visual Studio 设计器中打开 Word 模板,该模板上没有嵌入到文本中的控件可能不可见。这是因为 Visual Studio 在**“普通”视图中打开 Word 模板。若要查看这些控件,请单击“视图”菜单,指向“Microsoft Office Word 视图”,然后单击“打印布局”**。
插入剪贴画命令在 Visual Studio 设计器中不起作用
当在 Visual Studio 设计器中打开 Excel 或 Word 后,单击功能区中**“插图”选项卡上的“剪贴画”按钮不会打开“剪贴画”**任务窗格。若要添加剪贴画,则必须在 Visual Studio 的外部打开位于主项目文件夹中的工作簿或文档的副本(而不是位于 \bin 文件夹中的副本),再添加剪贴画,然后保存工作簿或文档。
编写代码
在 Office 项目中编写代码时,可能会遇到以下错误。
使用 C# 时 Office 对象的某些事件不可访问
在某些情况下,当您尝试在 Visual C# 项目中访问 Office 主互操作程序集 (PIA) 类型的实例的特定事件时,可能会看到类似于下面的编译器错误。
“‘Microsoft.Office.Interop.Excel._Application.NewWorkbook’与‘Microsoft.Office.Interop.Excel.AppEvents_Event.NewWorkbook’之间存在二义性”
此错误意味着您正尝试访问的事件与对象的其他属性或方法同名。若要访问该事件,必须将对象强制转换为其事件接口。
具有事件的 Office PIA 类型实现两种接口:核心接口和事件接口;前者包含所有属性和方法,后者则包含由对象公开的事件。这些事件接口使用命名约定 对象名Eventsn_Event,例如 Microsoft.Office.Interop.Excel.AppEvents_Event 和 Microsoft.Office.Interop.Word.ApplicationEvents2_Event。如果无法访问应在某一对象中找到的事件,请将该对象强制转换为其事件接口。
例如,Microsoft.Office.Interop.Excel.Application 对象具有一个 NewWorkbook 事件和一个 NewWorkbook 属性。若要处理 NewWorkbook 事件,请将 Microsoft.Office.Interop.Excel.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 中的事件接口的更多信息,请参见 Overview of Classes and Interfaces in the Office Primary Interop Assemblies。
无法引用 Office 在面向 .NET Framework 4 或 .NET Framework 4.5项的插入样式中选件类
默认情况下在面向 .NET Framework 4 或 .NET Framework 4.5的项目中,引用的代码在 Office 插入样式中定义的选件类不能编译。PIA 中的类使用命名约定 对象名Class,例如 DocumentClass 和 WorkbookClass。例如,Word 外接程序项目中的以下代码将不进行编译。
Dim document As Word.DocumentClass = Globals.ThisAddIn.Application.ActiveDocument
Word.DocumentClass document = (Word.DocumentClass) Globals.ThisAddIn.Application.ActiveDocument;
此代码会产生以下编译错误:
Visual Basic:“如果使用 No-PIA 模式链接了类‘DocumentClass’的程序集,则不允许引用该类。”
Visual C#:“无法嵌入互操作类型‘Microsoft.Office.Interop.Word.DocumentClass’。请改用适用的接口。”
若要解决此错误,请修改该代码以改为引用相应的接口。例如,应引用 Document 接口的实例,而不是引用 DocumentClass 对象。
Dim document As Word.Document = Globals.ThisAddIn.Application.ActiveDocument
Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;
面向 .NET Framework 4 或 .NET Framework 4.5默认情况下的项目,会自动嵌入 Office 插入样式中的所有互操作类型。发生此编译错误的原因是嵌入互操作类型功能仅适用于接口,而不适用于类。有关 Office PIA 中接口和类的更多信息,请参见 Overview of Classes and Interfaces in the Office Primary Interop Assemblies(Office 主互操作程序集中的类和接口概述)。有关 Office 项目中嵌入互操作类型功能的更多信息,请参见设计和创建 Office 解决方案。
无法识别对 Office 类的引用
有些类名称(如 Application)位于多个命名空间中,如 Microsoft.Office.Interop.Word 和 System.Windows.Forms。因此,位于项目模板的顶部的 Imports 或 using 语句中包含简写的限定常数,例如:
Imports Word = Microsoft.Office.Interop.Word
using Word = Microsoft.Office.Interop.Word;
Imports 或 using 语句的这种用法要求您使用 Word 或 Excel 限定符区分对 Office 类的引用,例如:
Dim doc As Word.Document
Word.Document doc;
如果使用非限定性声明,您将收到错误消息,例如:
Dim doc As Document ' Class is ambiguous
Document doc; // Class is ambiguous
即使已导入 Word 或 Excel 命名空间并且有权访问其中的所有类,也必须用 Word 或 Excel 完全限定所有类型,以消除命名空间的多义性。
生成项目
生成 Office 项目时,可能会遇到以下错误。
无法生成基于具有受限权限的文档的文档级项目
如果文档具有受限权限,则 Visual Studio 无法生成文档级项目。如果项目中包含具有受限权限的文档,则将无法编译该项目,并且您将在**“错误列表”**窗口中收到下面的消息。
“未能添加自定义。”
如果要包括具有受限权限的文档,请在开发和生成解决方案时使用无限制的文档。然后,在发布解决方案之后对发布位置中的文档应用受限权限。
删除 NamedRange 控件后发生编译器错误
如果从不是设计器中的活动工作表的工作表中删除 NamedRange 控件,可能不会从项目中移除自动生成的代码,并可能发生编译器错误。为了确保移除这些代码,应在删除 NamedRange 控件前总是选中包含该控件的工作表,使其成为活动工作表。如果在删除该控件时没有删除自动生成的代码,可激活该工作表并进行更改以将该工作表标记为已修改,从而令设计器删除这些代码。当您重新生成项目时,将移除这些代码。
调试项目
调试 Office 项目时,可能会遇到以下错误。
在开发计算机上发布和安装解决方案时显示卸载提示
调试 Office 解决方案时,您可能会看到下面的错误。
“由于已经安装了另一版本的自定义项且不能从该位置升级,无法安装该自定义项。”
此错误表明您以前在开发计算机上发布和安装了 Office 解决方案。若要避免出现此消息,请在调试解决方案之前从计算机上的已安装程序列表中卸载解决方案。或者,可以在开发计算机上创建其他用户帐户以测试已发布解决方案的安装。
在 UNC 网络位置创建的文档级项目无法从 Visual Studio 运行
如果在 UNC 网络位置为 Excel 或 Word 创建文档级项目,则必须将文档的位置添加到 Excel 或 Word 中的受信任位置列表中。否则,尝试在 Visual Studio 中运行或调试该项目时,将不会加载自定义项。有关受信任位置的更多信息,请参见向文档授予信任。
调试后线程没有正确停止
Visual Studio 中的 Office 项目遵循能够使调试器正确关闭程序的线程命名约定。如果在解决方案中创建线程,应当用前缀 VSTA_ 为每个线程命名,以确保当停止调试时会正确处理这些线程。例如,可以将某个等待网络事件的线程的 Name 属性设置为 VSTA_NetworkListener。
无法在开发计算机上运行或调试任何 Office 解决方案
如果无法在开发计算机上运行或开发 Office 项目,则可能会看到下面的错误消息。
“未能加载自定义项,因为无法创建应用程序域。”
Visual Studio 使用 .NET Framework 程序集加载程序 Fusion 在加载 Office 解决方案之前缓存程序集。确保 Visual Studio 可以写入 Fusion 缓存,然后重试。有关更多信息,请参见影像复制程序集。
使用“编辑并继续”后在文档级项目中停止调试器时出错
如果在项目处于中断模式时使用“编辑并继续”对 Excel 或 Word 的文档级项目中的代码进行更改,随后停止调试器,则可能会看到一个对话框,其中包含下面的错误消息。
“在当前状态下终止进程可能导致意外结果,包括丢失数据和系统不稳定。”
无论在该对话框中单击**“是”还是“否”**,Visual Studio 都会终止 Excel 或 Word 进程并停止调试器。若要停止调试项目而不显示此对话框,请直接退出 Excel 或 Word,而不是在 Visual Studio 中停止调试器。