Visual Studio 设计时的疑难解答

更新:2007 年 11 月

当您使用 Visual Studio Tools for Office 开发解决方案时可能出现以下问题。

保存解决方案然后运行它会引发一个错误

Visual Studio 在保存解决方案之前将解决方案存储在临时文件夹中。Visual Studio Tools for Office 会自动将安全策略更改为信任临时位置的解决方案。这些更改在生成解决方案时发生。如果在将解决方案保存到永久文件夹之前没有做任何更改,当您从新位置再次运行该解决方案时,Visual Studio 将不会生成该解决方案。因此,解决方案在新位置不会自动被信任,解决方案也不会运行。

如果在将新解决方案保存到永久位置后发生错误,请打开“生成”菜单,然后单击“重新生成解决方案”。这会使 Visual Studio 生成解决方案,即使没有对其进行任何更改也是如此。Visual Studio Tools for Office 随后会对新位置的安全策略进行相应的更改。

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

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

未能添加自定义。

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

使用 C# 时某些事件没有引发

有相同名称的方法和事件的 Office 对象在 Office 主互操作程序集中被拆分成两个对象:带所有属性和方法的核心对象,以及包含与属性或方法名称冲突的事件的事件对象。这些事件对象使用命名约定 <objectname>_Event。如果您没有看见您所期望的事件,请强制转换为 <objectname>_Event 接口。

例如,Workbook 有 ActivateEvent 事件和 Activate 方法。若要处理此事件,请使用 WorkbookEvents_Event,而不是 Workbook。

在声明部分创建成员变量:

private Excel.Workbook wkbk;
private Excel.WorkbookEvents_Event wbEvents;
private Excel.WorkbookEvents_ActivateEventHandler activateEvent;

在 _Startup 中连接事件:

wbEvents = (Excel.WorkbookEvents_Event)wkbk;
activateEvent = new Excel.WorkbookEvents_ActivateEventHandler(ThisWorkbook_Activate);
wbEvents.Activate += activateEvent;

编写事件处理程序:

private void ThisWorkbook_Activate()
{
    // Your code goes here.
} 

必须强制转换成 WorkbookEvents_Event,因为 Excel.Workbook.Activate 返回 Activate 方法,而不返回 ActivateEvent 事件。

作为一种备选方法,可以在 Startup 中将对象强制转换成其对应的事件接口:

((Excel.WorkbookEvents_Event)(Globals.ThisWorkbook.InnerObject)).Activate += 
    new Excel.WorkbookEvents_ActivateEventHandler(ThisWorkbook_Activate); 

然后为代码编写事件处理程序:

private void ThisWorkbook_Activate()
{
    // Your code goes here.
} 

无法识别对 Office 类的引用

有些类名称(如 Application)位于多个命名空间中,如 Microsoft.Office.Interop.WordSystem.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 完全限定所有类型,以消除命名空间的多义性。

基于现有项目的文档创建新项目时控件属性丢失

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

控件在文档或工作表中显示为黑色矩形

如果对文档或工作表中的控件进行分组,则 Visual Studio Tools for Office 将不再识别控件。分组后的控件不能在“属性”窗口中访问,而且它们在文档或工作表中显示为黑色矩形。为了还原控件的功能,必须取消对控件进行分组。

Word 模板中的控件在 Visual Studio 中不可见。

如果在 Visual Studio 设计器中打开 Word 模板,该模板上没有嵌入到文本中的控件可能不可见。这是因为 Visual Studio 在“普通”视图中打开 Word 模板。若要查看这些控件,请单击“视图”菜单,指向“Microsoft Office Word 视图”,然后单击“打印布局”。

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

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

将 Microsoft Office 2003 项目命名为 Excel 或 Word 时发生编译器错误

Excel 和 Word 是 Office 项目中的保留关键字。

删除 NamedRange 控件后发生编译器错误

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

指向程序集的 HTTP 路径不起作用

最有可能的两种情况是:

  • “Visual Studio Tools for Office 项目向导”没有为在 HTTP 位置创建的程序集修改安全策略。您必须手动向程序集授予完全信任。有关更多信息,请参见如何:将权限授予文件夹和程序集 (2003 System)

  • 默认情况下,ASP.NET 禁止下载 DLL。要使程序集能够下载到用户计算机上,Web 服务器管理员必须更改 Internet 信息服务 (IIS) 属性,允许从存储程序集的目录下载 DLL。有关更多信息,请参见 Internet 信息服务 (IIS) 的帮助,它位于 Web 服务器上的 https://localhost/iisHelp/。

    要测试问题是否由此引起,您可以查看 Web 服务器的日志中是否有被拒绝的 DLL 请求。如果问题看起来是由其他原因引起的,请将调试器设置为在发生所有异常时中断,并查看错误信息。

在 UNC 网络位置创建的项目不自动修改安全策略

“Visual Studio Tools for Office 项目向导”在用户级别上修改安全策略。如果您在 UNC 网络位置创建了一个项目,那么,在可以运行该项目之前,必须在计算机级别上修改安全策略,以向程序集授予完全信任。您必须手动更改计算机级别的策略。有关更多信息,请参见如何:将权限授予文件夹和程序集 (2003 System)

打开文档时未引发 DocumentChange 事件

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

调试后线程没有正确停止

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

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

插入剪贴画命令在 Visual Studio 设计器中不起作用

当 Excel 或 Word 在 Visual Studio 设计器中打开时,打开“插入”菜单,指向“图片”,然后单击“剪贴画”并没有打开“剪贴画”任务窗格。若要使用菜单命令添加剪贴画,必须在 Visual Studio 外面打开位于主项目文件夹的工作簿或文档的副本(而不是位于 \bin 文件夹中的副本),添加剪贴画,然后保存工作簿或文档。

虽然安装了 Office 2003,但仍无法创建 2003 文档级项目

如果您卸载了 2007 Microsoft Office system,然后安装 Office 2003,则可能出现此问题。在创建 2003 文档级自定义项项目时,可能收到以下错误消息:

“此计算机上未安装 Microsoft Office 的兼容版本。”

若要解决此问题,请执行以下操作:

  1. 关闭 Visual Studio。

  2. 打开相应的 Microsoft Office 应用程序,然后关闭该应用程序。例如,如果您想创建一个 Excel 2003 工作簿项目,则打开 Excel 2003,然后关闭它。

  3. 启动 Visual Studio,然后创建项目。

在 Visual Studio 中打开 Excel 文档级自定义项项目时,Excel 工作簿被禁用

如果您打开 Excel 2007,然后在 Visual Studio 中创建了一个 Excel 2007 文档级自定义项项目,则最先打开的工作簿停止响应。

若要解决此问题,请单击在 Visual Studio 设计器中可见的工作表。您最先打开的工作簿将开始响应。

请参见

任务

如何:部署文档以供脱机使用 (2003 System)

Office 运行时的疑难解答

概念

安全部署 (2003 System)

Office 编程中的常见任务

其他资源

Office 解决方案的疑难解答