12

我们的开发机器是运行 Windows 7 Professional N(64 位)、64 位 Office Professional 2010 和 Visual Studio Professional 2010 的 64 位硬件。

我们使用 .NET Framework 4、功能区和面向 Office 2010 的 Windows 安装程序创建了一个 Word 2010(应用程序级加载项)。我们多次遵循从官方 MSDN 在线教程到点的所有内容。对于我们的安装程序,我们选择 .NET 4 客户端配置文件和 Windows 安装程序 3.1 作为先决条件,因为 Office 2010 安装了 VSTO 4.0 运行时并且 .NET 框架 4 没有 PIA 功能。在启动条件中,我们使用适当的组件 ID 检查了 Office 2010 Shared PIA 和 Word 2010 PIA 的可用性。此外,我们检查了 VSTO 运行时可用性,如 MSDN 文章中所述。

我们的加载项仅在 Visual Studio 调试 ( F5) 中加载和执行完整功能。构建安装项目会创建 Windows 安装程序 (msi)。安装它会在机器上安装插件而不会出现任何错误。但是,当我们尝试打开任何 Word 2010 文档时安装加载项后,我们会看到以下行为:

  1. 我们尝试打开任何 Microsoft Word 2010 文档,出现 Word 2010 启动屏幕,我们可以看到我们的加载项正在加载“正在加载 [我们的] 加载项”,但随后 Word 2010 没有打开。启动屏幕消失并且不显示错误消息。

  2. 第二次打开word文档只会触发这条消息(这次没有word 2010启动屏幕):

    Word 遇到了与'[Our] word addin'加载项有关的严重问题。如果您多次看到此消息,则应禁用此加载项并检查是否有可用更新。是否要禁用此加载项?

    单击否,会短暂启动 Microsoft Word 2010 的启动屏幕,然后再次停止加载(消失)。单击是,打开 Word 2010 并[Our]禁用加载项。通过单击 File-Options-AddIns 进行验证。在禁用的应用程序加载项下查看

    设置VSTO_SUPPRESSDISPLAYALERTS=0VSTO_LOGALERTS=1没有用。我们检查了我们的 Temp 目录,没有日志。

  3. 由于上述方法不起作用,我从此链接下载了名为“使用 Windows Installer 为 Office 2007/2010 部署 VSTO 2010 解决方案”的示例项目, 并使用了在 Office Development - 下找到的适当项目Setup and Deployment Projects Samples\FX40\AddIn Deployment\All User Install for 64-bit Office

    最初,我通过创建和运行安装程序 (msi) 测试了正确加载演示 Excel 2010 插件项目的解决方案,然后我们将我们的 Word 插件项目逐个文件添加到解决方案文件中并正确构建它 ( CTRL++ SHIFT) B。它甚至可以从 Visual Studio 调试 (F5) 正确运行。然后我们重新配置现有的设置项目以删除演示 Excel 项目并加载我们的 word Add-In 的主要输出,[OurAdd-In].vsto 和 [OurAdd-In].dll.manifest 文件。我们刷新了项目依赖项并采取了适当的步骤来排除相关文件。我们保持注册表检查完好无损,并添加了启动条件来检查 Word 2010 PIA。

    安装程序成功构建并且安装没有错误,但不幸的是,我们目睹了与之前描述的 Word 2010 完全相同的行为。

我们还尝试使用 Windows 事件日志进行调试。我发现此事件的事件 ID 为 4096:

************** Exception Text **************
Microsoft.VisualStudio.Tools.Applications.Deployment.FrameworkVersionMismatchException: <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2">
 <framework targetVersion="4.0" profile="Client" supportedRuntime="4.0.30319" />
 <framework targetVersion="4.0" profile="Full" supportedRuntime="4.0.30319" />
</compatibleFrameworks>

我们需要为 32 位和 64 位 Word 2010 的 Word 加载项创建安装程序。


我已经进一步研究,这就是我发现的。

我使用 AddInSpy 进一步调查,这是我得到的调试信息......

<addIn>
 <Item>1</Item> 
 <Host>Word</Host> 
 <Running>true</Running> 
 <Loaded>false</Loaded> 
 <Type>VSTO</Type> 
 <FriendlyName>[OURADDIN]WordAddIn</FriendlyName> 
 <ProgID>[OURADDIN].WordAddIn</ProgID> 
 <CLSID>n/a</CLSID> 
 <Manifest>C:\Program Files\Microsoft\[OURADDIN]Setup2010\[OURADDIN]WordAddIn.vsto|vstolocal</Manifest> 
 <DllPath>C:\Program Files\Microsoft\[OURADDIN]Setup2010\[OURADDIN]WordAddIn.dll</DllPath> 
 <LoadBehavior>3</LoadBehavior> 
 <RegHive>HKCU</RegHive> 
 <AssemblyName>?</AssemblyName> 
 <CLR_version>?</CLR_version> 
 <Exposed>false</Exposed> 
 <Interfaces>?</Interfaces> 
 <FormRegions>n/a</FormRegions> 
 <VSTOR>2008</VSTOR> 
 <Installed>?</Installed> 
 <PubVer>n/a</PubVer> 
 <Status>Alert</Status> 
 <StatusDescription>Add-in DLL path is not found. System.BadImageFormatException: Could not load file or assembly 'file:///C:\Program Files\Microsoft\[OURADDIN]Setup2010\[OURADDIN].dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
File name: 'file:///C:\Program Files\Microsoft\[OURADDIN]Setup2010\[OURADDIN].dll'
  at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
  at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
  at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
  at System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, StackCrawlMark& stackMark)
  at System.Reflection.Assembly.ReflectionOnlyLoadFrom(String assemblyFile)
  at AddInSpy.AssemblyScanner.GetAssemblyInfo(String fileName, String hostName, Boolean isVstoAddIn)

Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable C:\Users\Interance\Downloads\AddInSpy\AddInSpy.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = Interance-PC\Interance
LOG: Where-ref bind. Location = C:\Program Files\Microsoft\[OURADDIN]Setup2010\[OURADDIN].dll
LOG: Appbase = file:///C:/Users/Interance/Downloads/AddInSpy/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This is an inspection only bind.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Attempting download of new URL file:///C:/Program Files/Microsoft/[OURADDIN]Setup2010/[OURADDIN]AddIn.dll.
ERR: Failed to complete setup of assembly (hr = 0x8013101b). Probing terminated.
</StatusDescription> 
 </addIn>

我相信上面有趣的是以下几行

此程序集由比当前加载的运行时更新的运行时构建,无法加载...

从以下位置加载程序集管理器:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

日志:使用 C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config 中的机器配置文件。

据我了解,Word 2010 正在尝试使用Assembly Manager 和引用F/W 版本的机器配置文件加载我的加载项,v2.0.50727因为\Framework64\v4.0.30319\我已经使用.NET 4 构建了我的加载项。结果是错误信息'This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded...'

我想这可能是源头。任何想法为什么会发生这种情况以及如何解决它?


嗯...我想我应该在前面提到这一点,但我正在使用 open xml 2 sdk 在我的 Word 2010 插件中使用 .NET f/w 4 创建/读取 word 文件。我遵循了此处提供的文档. 如果您向下滚动该页面,您将在“介绍 Open XML SDK 格式架构”小节系统支持层中找到它支持 .NET f/w 3.5 并且当前 Open XML 格式 SDK 基于标准 Ecma-376。

此外,经过几个小时的眯眼阅读大量文章,例如Chris Rae 的 详细文章,他指出 Office 2010 使用另一种标准 ISO/IEC 29500 作为其默认文件格式,而 Office 2007 支持 ECMA-376。此外,它指出:

ISO/IEC 29500 是 ECMA-376 的直接后代。事实上,它是如此直接的后代,以至于 ECMA-376 第 2 版与 ISO/IEC 29500 相同。

我发现 Open XML SDK Format Architecture 系统支持层支持 .NET f/w 3.5,目前 Open XML Format SDK 2 基于标准 Ecma-376。

参考链接

因此,我只是想知道 Open XML SDK 2 是否是我问题的根源?由于 ISO/IEC 29500 是 ECMA-376 的后代,我可以使用 Open XML SDK 2 在我的代码中创建/修改 word 2010 文档吗?

这就是为什么要从中加载程序集管理器和机器配置文件的原因framework\v2.0.50727\ and not from \Framework64\v4.0.30319\吗?

4

2 回答 2

7

原因是 Open XML SDK 2,我避免使用 Open XML SDK 2,我的 AddIn 现在可以完美运行。使用 Microsoft Interop 从头开始​​重建我的项目,以读取/写入 Microsoft Office 2010 文档。

问题是没有太多的文档可供开发人员阅读。我已经完成了阅读文章并自己解决问题的繁重工作。

希望其他人不必面临同样的考验。

于 2010-10-12T07:37:40.047 回答
0

请参阅以下链接可能会有所帮助...如何创建自定义安装程序

它帮助了我,我遇到了一个有点类似的场景(Word 2010 Addin + Open XML SDK 2.0 - 部署在从 Windows XP Service Pack 3 32 位到 Windows 7 Professional 64 位运行的机器上)。

希望它可以帮助你。

于 2011-10-14T14:33:41.473 回答