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.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 完全限定所有类型,以消除命名空间的多义性。
基于现有项目的文档创建新项目时控件属性丢失
如果基于现有项目中的文档创建新 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 的兼容版本。”
若要解决此问题,请执行以下操作:
关闭 Visual Studio。
打开相应的 Microsoft Office 应用程序,然后关闭该应用程序。例如,如果您想创建一个 Excel 2003 工作簿项目,则打开 Excel 2003,然后关闭它。
启动 Visual Studio,然后创建项目。
在 Visual Studio 中打开 Excel 文档级自定义项项目时,Excel 工作簿被禁用
如果您打开 Excel 2007,然后在 Visual Studio 中创建了一个 Excel 2007 文档级自定义项项目,则最先打开的工作簿停止响应。
若要解决此问题,请单击在 Visual Studio 设计器中可见的工作表。您最先打开的工作簿将开始响应。