Office 运行时的疑难解答
更新:2007 年 11 月
如果生成解决方案时出现来自 Microsoft Office 的错误消息,或者最终用户报告了错误消息,则这可能是下列常见问题之一引起的。
无法加载公共语言运行时或 Microsoft .NET Framework
此问题导致显示以下错误信息:
<application> 无法加载公共语言运行时。如想获得进一步的帮助,请与管理员联系。
最终用户计算机上的 Microsoft .NET Framework 的版本必须与用于开发该解决方案的计算机上的软件版本相同或更高。有关安装 .NET Framework 和公共语言运行时的更多信息,请参见 Microsoft .NET Framework downloads(Microsoft .NET Framework 下载)页。
自定义宏需要公共语言运行时
此问题导致显示以下错误信息:
此文档中的自定义宏要求已安装公共语言运行时 2.0 版本。如想获得进一步的帮助,请与管理员联系。
此实例中的自定义宏指托管程序集。最终用户可能安装了与您的解决方案不兼容的 Microsoft .NET Framework 版本。您必须在最终用户的计算机上安装与您用于开发该解决方案的版本相同或更高的 .NET Framework 版本。可以与现有版本并行安装。有关安装 .NET Framework 和公共语言运行时的更多信息,请参见 Microsoft .NET Framework downloads(Microsoft .NET Framework 下载)页。
安全策略不允许程序集运行
此问题导致显示以下错误信息:
当前的 .NET 安全策略不允许从 <路径> 文件夹中运行 <程序集>。不要更改计算机中的安全策略。.NET 安全策略由管理员或编写自定义宏的开发人员控制。您仍可以编辑和保存文档。请与管理员或此文档的作者联系以获得进一步帮助。
此实例中的自定义宏指托管程序集。该程序集是不受信任的,可能会造成损害。如果您确信该程序集是安全的,在运行它之前必须在用户的 .NET 安全策略中授予它完全信任。有关更多信息,请参见如何:将权限授予文件夹和程序集 (2003 System)。
安全策略不允许文档加载程序集
此问题导致显示以下错误信息:
当前的 .NET 安全策略不允许 <文档> 加载自定义宏。不要更改计算机中的安全策略。.NET 安全策略由管理员或编写自定义宏的开发人员控制。您仍可以编辑和保存文档。请与管理员或此文档的作者联系以获得进一步帮助。
此实例中的自定义宏指托管程序集。很可能该文档是从不受信任的位置或从电子邮件附件中打开的,它可能会造成损害。如果您确信该文档是安全的,请将其保存到用户的计算机上,然后打开它。将其保存到计算机上之后,该文档位于“我的电脑”区域,具有完全信任权限。如果该文档是电子邮件附件,则它位于 Internet 区域,不具有完全信任权限。
另一种可能性是,曾经在计算机上安装了 Microsoft .NET Framework 的正确版本,但在运行该解决方案前将其删除了。如果用户并行安装了两个 .NET Framework 版本,然后删除了一个版本,则会出现此安全消息,而不会出现一条声明未安装所需版本的 .NET Framework 的消息。若要运行解决方案,则必须安装 .NET Framework。
有关更多信息,请参见运行 Office 解决方案的安全要求 (2003 System)。
当项目程序集有完全信任时出现安全异常
如果当您确信主项目程序集有完全信任时收到安全异常,可能是引用的程序集正在尝试执行一项操作,而程序集没有完成该项操作所必需的权限。您必须向引用的程序集手动授予任何必需的权限。
当在开发人员的计算机上生成一个项目时,所有在该项目的输出文件夹中的引用程序集都被授予“执行”权限。只有主项目程序集被自动授予完全信任。
无法找到或加载程序集
此问题导致显示以下错误信息:
无法找到或加载自定义程序集。您仍可以编辑和保存文档。请与管理员或此文档的作者联系以获得进一步帮助。
若要解决此错误,请尝试以下方法:
检查用户是否能够访问程序集位置,并检查指定的程序集是否存在。有关更多信息,请参见 Office 解决方案中的程序集概述。
如果存在该程序集,则请检查 Word 或 Excel 所运行的某个自定义项(如外接程序、智能标记或智能文档)是否显式加载了与 Visual Studio Tools for Office 运行时不兼容的 .NET Framework 公共语言运行时 (CLR) 版本。若要解决此问题,请禁用任何显式加载与解决方案所用运行时不匹配的 .NET Framework CLR 版本的自定义项。
一个运行程序只能调用 .NET Framework CLR 的一个实例。如果自定义项强制 Word 或 Excel 加载 .NET Framework CLR 的早期版本,则 Visual Studio Tools for Office 解决方案将无法加载。
检查自定义项程序集中是否有未处理的异常正在阻止程序集加载。将调试器设置为在遇到公共语言运行时异常时中断,或者在“选项”对话框中选择“当异常跨越 AppDomain 或托管/本机边界时中断”选项,调试解决方案。有关更多信息,请参见如何:处理 Office 项目中的错误和“选项”对话框 ->“调试”->“常规”。
无法初始化程序集
此问题导致显示以下错误信息:
无法正确初始化 <项目> 中的自定义宏。您仍可以编辑和保存文档。请与管理员或此文档的作者联系以获得进一步帮助。
此实例中的自定义宏指托管程序集。
此错误信息的部分原因包括:
主 Office 项目程序集是部分受信任的。例如,如果您在网络共享上创建了一个项目,而它在计算机级别的安全策略中只有 Intranet 区域的权限,那么,即使您在用户级别向它授予了完全信任,您仍然会收到此信息。加载程序集时不会出现安全警告,但由于计算机级别的策略具有更严格的限制,因此程序集没有访问 Office 对象模型的必需权限(这要求完全信任),程序集从而无法初始化。如果您处理的程序集没有存储在本地计算机上,则网络管理员必须在计算机级别向它授予完全信任。有关更多信息,请参见运行 Office 解决方案的安全要求 (2003 System)。
在添加对一个 COM 组件的引用前,该 COM 组件的主要互操作程序集没有安装在全局程序集缓存中。Visual Studio 生成的互操作程序集也许不能在所有情况下正常工作,并且 Visual Studio 将该程序集放在项目目录中,而不是全局程序集缓存中。
引用正确的互操作程序集
查找您的项目中所有将 Copy Local 属性设置成了 True 的对 COM 组件(例如 Office 应用程序)的引用。
右击该引用,然后单击快捷菜单上的“移除”。
运行“添加或删除程序”并在全局程序集缓存中安装组件的主互操作程序集。有关更多信息,请参见如何:安装 Office 主互操作程序集。
在 Visual Studio 中打开您的项目,添加指向该组件的新引用。有关更多信息,请参见如何:通过主互操作程序集面向 Office 应用程序。
无法脱机使用程序集
此情况导致显示以下错误信息:
无法脱机使用 <路径> 中的自定义宏。是否要联机以下载该自定义项?这可能会影响计算机上运行的其他程序,例如 Internet Explorer。
此实例中的自定义宏指托管程序集。当计算机处于脱机模式,并且缓存中没有程序集的副本时,会出现此消息。要脱机工作,必须满足下列条件:
程序集必须位于 Web 服务器上。
程序集必须可以通过自定义属性中的 HTTP 或 HTTPS 路径访问。
要缓存满足上述条件的程序集,必须至少联机一次并打开 Office 文档以下载该程序集的副本。这样程序集就可以在脱机工作时使用了。有关更多信息,请参见 Office 解决方案的脱机模型 (2003 System) 和如何:部署文档以供脱机使用 (2003 System)。
由于计算机只有一种脱机和联机模式,其他程序可能会受到影响。如果您在 Internet Explorer 的“文件”菜单上选择了“脱机工作”,所有应用程序都会脱机工作。
无法联机使用程序集
此情况导致显示以下错误信息:
无法联机使用 <路径> 中的自定义宏,但是可以使用本地副本。是否要脱机并使用缓存的副本?这可能会影响计算机上运行的其他程序,例如 Internet Explorer。
此实例中的自定义宏指托管程序集。在您的计算机未与网络连接或网络出现故障,而计算机处于联机模式时,会出现此消息。单击“确定”可以使您的计算机转到脱机模式并使用程序集的缓存副本。要使用缓存的程序集,您必须将计算机设置为脱机模式,方法是单击此对话框上的“确定”,或在 Internet Explorer 的“文件”菜单上选择“脱机工作”。有关更多信息,请参见 Office 解决方案的脱机模型 (2003 System) 和如何:部署文档以供脱机使用 (2003 System)。
由于计算机只有一种脱机和联机模式,其他程序可能会受到影响。如果您将计算机设置为脱机模式,所有应用程序都将脱机工作。
无法加载程序集
此问题导致显示以下错误信息:
无法从程序集 <程序集名称> 加载类型 <项目名称>。
如果您对解决方案代码进行模糊处理,可能显示此消息。对代码进行模糊处理会更改所有类的名称。但是,在清单中却引用了原始类名称,并且模糊处理程序没有更改清单。
若要避免此错误,请将工作表和工作簿类的名称添加到模糊处理程序的不重命名的类列表中。
区域设置导致一些 Excel 方法返回错误
如果在最终用户的区域设置中选择的区域设置与 Microsoft Office Excel 2003 的安装语言不匹配,则用户在调用某些 Excel 方法和属性时可能会收到下列错误:
在 mscorlib.dll 中出现最可能的“System.Runtime.InteropServices.COMException”类型的异常。
其他信息:HRESULT 中的异常:0x800A03EC。
- 或 -
在 ExcelProject.dll 中出现最可能的“System.Runtime.InteropServices.COMException”类型的异常。
其他信息:格式太旧或类型库无效。
有关更正此问题的详细信息,请参见 Office 解决方案的全球化和本地化。
Office 文档打开时没有错误,但不执行代码
代码不运行同时也不显示错误信息的原因包括:
Office 主互操作程序集没有安装在全局程序集缓存中,可能是因为计算机上没有安装 .NET Framework,或程序集在 Office 设置中被标记为“不可用”。
所使用的 Word 或 Excel 版本不支持 Visual Studio Tools for Office 解决方案。最终用户必须从支持 Visual Studio Tools for Office 的 Microsoft Office 2003 版本中安装 Word 和/或 Excel。有关更多信息,请参见如何:安装 Visual Studio Tools for Office 以便对 Microsoft Office 2003 进行开发。
文档从 HTTP 或 HTTPS 位置打开,并且 Windows 资源管理器中没有为 .doc 或 .xls 文件选择“在同一窗口中浏览”选项。Internet Explorer 使用此选项确定文档承载在当前窗口中还是单独的窗口中。如果文档承载在单独的窗口中,将不会加载和运行自定义项。若要访问 Word 或 Excel 文档的“在同一窗口中浏览”选项,请打开 Windows 资源管理器,单击“工具”菜单,然后单击“文件夹选项”。在“文件类型”选项卡上,在文件类型列表中选择“DOC”或“XLS”,单击“高级”并验证已选中了“在同一窗口中浏览”。
在同一台计算机上的 Visual Studio 中打开 Word 文档项目。关闭 Visual Studio 并重新打开文档。
有关更多信息,请参见在文档级项目中进行调试。
宏安全级别已设置为高,但代码仍然运行
即使最终用户的 Office 应用程序中的“安全性”设置已设为“高”,使用托管代码扩展创建的 Microsoft Office 2003 解决方案仍然可以运行。这是因为托管程序集代码安全性是由 Microsoft .NET Framework 控制的,而不是由 Microsoft Office Word 2003 或 Microsoft Office Excel 2003 控制的。然而,可以使用多种方法打开包含托管代码扩展的文档或工作簿,而不用运行程序集代码。有关更多信息,请参见如何:打开 Office 解决方案但不运行代码。
当无模式窗体上出现未处理的异常时 Excel 和 Word 意外退出
如果 Excel 或 Word 在用户触发无模式窗体上的事件后意外退出,请检查代码中是否有地方会引发未处理的异常。添加错误处理可以防止可能的数据丢失。
Outlook 外接程序不能加载或被禁用
如果 Outlook 外接程序未正确加载,则需要检查以下几种可能性:
如果 Microsoft Office Outlook 意外退出,或初始化外接程序时发生错误,则 Outlook 可能会禁用该外接程序。有关更多信息,请参见如何:重新启用已禁用的外接程序。
如果外接程序清单文件与外接程序程序集不在同一目录中,Outlook 外接程序可能无法加载。如果将清单文件部署到不同目录,则必须更新外接程序清单文件中 asmv2:installFrom 元素的 codebase 属性,以指向外接程序的程序集的位置。
Outlook 可能正在运行某个外接程序,该外接程序显式加载了与 Visual Studio Tools for Office 运行时不兼容的 .NET Framework 公共语言运行时 (CLR) 版本。若要解决此问题,请禁用任何显式加载不兼容版本的 .NET Framework 的外接程序。
一个正在运行的应用程序只能加载 .NET Framework 的一个实例。如果外接程序强制 Outlook 加载 .NET Framework 的早期版本,则使用 Visual Studio Tools for Office 创建的外接程序将无法加载。
您可以通过设置环境变量来获取附加的疑难解答信息,这些变量可使 Visual Studio Tools for Office 显示详细错误消息并将所有操作写入日志文件。有关更多信息,请参见在应用程序级项目中进行调试。
不能使用 COM 外接程序对话框安装 Outlook 外接程序
不要使用“COM 外接程序”对话框安装使用 Visual Studio Tools for Office 创建的 Outlook 外接程序。请使用 Outlook 项目模板中包含的部署项目。Outlook 外接程序使用名为 AddinLoader.dll 的代理 .dll 文件,以扩展 Outlook 的功能。该代理使托管程序集可以通过 COM 与 Outlook 通信。有关更多信息,请参见部署应用程序级外接程序 (2003 System)。
无法在 Outlook 外接程序中添加自定义属性页
如果 Outlook 外接程序为 Outlook 的“选项”对话框或 Outlook 文件夹的“属性”对话框创建了自定义属性页,则您必须显式使自定义属性页对 COM 可见(默认情况下,程序集对 COM 不可见)。否则,外接程序创建自定义属性页将失败,同时您在调试外接程序时还可能收到 COMException。
以下两种方式可以使自定义属性页对 COM 可见:
将 ComVisibleAttribute 添加到项目中实现自定义属性页的类。有关将属性应用到类的更多信息,请参见 应用属性。
使用 Visual Studio 使整个外接程序程序集对 COM 可见。
使用 Visual Studio 使外接程序程序集对 COM 可见
在 Visual Studio 中,在“解决方案资源管理器”中右击您的项目,然后单击“属性”。
单击“应用程序”选项卡。
单击“程序集信息”按钮。
选择“使程序集 COM 可见”复选框。
单击“确定”。
Outlook 外接程序中永远不会引发 Quit 事件
如果为 Outlook 外接程序中的 Microsoft.Office.Tools.Outlook.Application 类的 Quit 事件创建了事件处理程序,该事件处理程序永远都不会运行。当您关闭正在运行使用 Visual Studio Tools for Office 创建的外接程序的 Outlook 实例时,外接程序在接收到 Quit 事件前就已被卸载了。作为一种备选方法,您可以将在 Outlook 关闭时要运行的代码放入项目中的 ThisAddIn_Shutdown 事件处理程序中。有关更多信息,请参见 2007 Microsoft Office 外接程序项目模板和 2003 Microsoft Office 外接程序项目模板。
Close 方法导致 Word 和 Excel 意外退出
当您从无模式窗体调用 Excel Workbook 对象或 Word Document 对象的 Close 方法时,应用程序可能意外退出。所有打开的文档或工作簿都将关闭,数据可能丢失。如果 Microsoft Office Outlook 使用 Word 作为其电子邮件编辑器,所有打开的电子邮件也可能关闭。如果在处理 AppDomain.DomainUnload 事件时显示 Windows 窗体或消息框,也可能出现这种情况。
若要避免此问题,请不要从无模式窗体或在无模式窗体的事件中调用 Close 方法。请改用下列过程:
如果必须从窗体关闭文档,请使用模式窗体(例如通过使用 ShowDialog,而不是 Show)。
如果必须使用无模式窗体,在试图关闭文档或工作簿之前,请确保无模式窗体已关闭,并且窗体引用已完全损坏。以下代码提供了一个示例:
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 解决方案中的可选参数。
设置“另存为”对话框的 Cancel 参数将返回不准确的警告或导致 Word 意外退出
如果在 ThisDocument 的 DocumentBeforeSave 事件处理程序内显示“另存为”对话框,并且将 Cancel 参数设置为 false,则应用程序可能会意外退出。如果将 Cancel 参数设置为 true,将显示一条错误信息,指示 Autosave 已禁用。
拆分 Excel 工作表窗口时 Windows 窗体控件出现不可预知的行为
如果拆分包含 Windows 窗体控件的工作表窗口,控件在两个窗口中的行为可能不一样。例如,如果运行代码更改工作表上 TextBox 的 BackColor 属性,则该更改可能只显示在一个窗口中。
将 Excel 宿主控件传递给方法时引发 InvalidCastException
Excel 中的某些方法和属性要求将本机 Office 对象传递给它们。如果 ExcelLocale1033Attribute 属性设置为 false,并且传入一个基于本机 Office 对象的宿主控件,则会引发 InvalidCastException。可以使用宿主控件的 InnerObject 属性将基础本机 Office 对象传递给这些方法和属性。有关 Excel 中的本地化问题的更多信息,请参见 使用各种区域设置对 Excel 中的数据进行格式设置。
如果显示模式对话框,则 ListObject 的数据绑定将失败
如果在绑定到 ListObject 的数据集更新期间,Excel 显示模式对话框,则 ListObject 的数据绑定将失败。当 ListObject 丢失数据绑定时,它将引发 DataBindingFailure 事件。若要将 ListObject 再次绑定到数据源上,请处理 DataBindingFailure 事件,并调用 SetDataBinding 方法。
双击部署清单导致错误
如果双击一个部署清单,将显示以下消息:
无法继续。应用程序的格式设置不正确。请联系应用程序供应商获取帮助。
与 ClickOnce 部署不同,您不能通过双击部署清单来运行 Visual Studio Tools for Office 解决方案。若要运行该解决方案,请打开 Office 应用程序。对于 Word 和 Excel,请在应用程序中打开解决方案文档。或者,可以双击该文档文件。
有关部署 Visual Studio Tools for Office 解决方案的更多信息,请参见部署文档级自定义项 (2003 System) 和部署应用程序级外接程序 (2003 System)。有关部署清单的更多信息,请参见 Office 解决方案的部署清单 (2003 System)。