Word 2010插件加载失败,vsto 2010。

12
我们的开发机器是64位硬件,运行Windows 7 Professional N(64位),64位Office Professional 2010和Visual Studio Professional 2010。
我们使用.NET Framework 4、Ribbons和Windows安装程序创建了一个Word 2010(应用程序级别Add-In),目标是Office 2010。我们按照官方MSDN在线教程的要求多次进行了操作。对于我们的安装程序,我们选择了.NET 4客户端配置文件和Windows安装程序3.1作为前提条件,因为Office 2010已经安装了VSTO 4.0运行时,并且.NET Framework 4具有无PIA功能。在启动条件中,我们使用适当的组件ID检查Office 2010共享PIA和Word 2010 PIA的可用性。此外,我们还按照MSDN文章中所述检查了VSTO运行时的可用性。
我们的Add-In仅在Visual Studio调试(F5)中加载并执行所有功能。构建设置项目将创建Windows安装程序(msi)。安装后,在机器上安装Add-In时没有任何错误。但是,在安装Add-In之后,当我们尝试打开任何Word 2010文档时,我们会看到以下行为:
  1. 我们尝试打开任何Microsoft Word 2010文档时,Word 2010启动屏幕出现并且我们可以看到我们的Add-In被加载 "Loading [Our] Add-In",但是Word 2010没有打开。启动屏幕消失,没有显示任何错误消息。
  2. 第二次打开Word文档时,只会弹出这个消息(这次没有Word 2010启动屏幕):

    Word经历了一个关于 '[Our] word addin' Add-In 的严重问题。如果您已经多次看到此消息,请禁用此Add-In并检查是否有可用的更新。您要禁用此Add-In吗?'

    单击“否”会短暂地启动Microsoft Word 2010的启动屏幕,然后再次停止加载(消失)。单击“是”会打开Word 2010,并禁用[Our] Add-In。通过单击文件-选项-加载项进行验证。在禁用的应用程序加载项下查找。

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

  3. 由于上述方法不起作用,我从这个链接下载了示例项目,名为'Deploying a VSTO 2010 solution for Office 2007/2010 using Windows Installer',并使用Office Development下的适当项目Setup and Deployment Projects Samples\FX40\AddIn Deployment\All User Install for 64-bit Office

    最初,我通过创建和运行安装程序(msi)来测试解决方案是否正确加载演示Excel 2010 Add-In项目。然后,我们通过文件逐个添加我们的Word AddIn项目到解决方案文件中,并正确构建它(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 Add-In。


我进行了进一步的研究,这是我发现的。

我使用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 正试图使用程序集管理器和机器配置文件引用 F/W 版本 v2.0.50727 来加载我的插件,但实际上应该引用 \Framework64\v4.0.30319\,因为我使用 .NET 4 构建了我的插件。所以会出现错误信息 '此程序集是由当前已加载的运行时版本较新的运行时生成的,因此无法加载...'

我认为这可能是问题的根源。你有什么想法,为什么会发生这种情况,并如何解决它?


嗯... 我想我应该早点提到这个,但是我正在使用open xml 2 sdk在我的Word 2010 Add-In中创建/读取word文件,使用的是.NET f/w 4。我已经按照此处提供的文档进行了操作。如果您滚动该页面,您会在介绍Open XML SDK格式架构子部分中找到系统支持层,它支持.NET f/w 3.5,目前Open XML Format SDK基于标准Ecma-376。

此外,在费力阅读了许多文章,例如Chris Rae详细文章之后,我发现Office 2010使用另一种标准ISO/IEC 29500作为其默认文件格式,而Office 2007支持ECMA-376。进一步说明:

ISO/IEC 29500是ECMA-376的直接后代。实际上,ECMA-376第二版与ISO/IEC 29500完全相同。我发现Open XML SDK格式架构系统支持层支持.NET f/w 3.5,目前Open XML格式SDK 2基于标准Ecma-376。因此,我想知道Open XML SDK 2是否是我的问题源头?由于ISO/IEC 29500是ECMA-376的后代,所以我能否在我的代码中使用Open XML SDK 2来创建/修改Word 2010文档?这就是为什么程序集管理器和机器配置文件从“framework\v2.0.50727\”而不是从“Framework64\v4.0.30319\”加载的原因吗?参考链接

+1 对于 AddInSpy - 以前不知道有这个工具。 - Ashish Gupta
2个回答

7

问题的根源在于Open XML SDK 2,我避免使用Open XML SDK 2后,我的AddIn现在可以完美工作了。我从头开始重建了项目,使用Microsoft Interop来读写Microsoft Office 2010文档。

问题在于开发者很难找到相关的文档进行阅读。我自己做了大量的研究和解决问题的工作。

希望其他人不必经历同样的困境。


0

或许下面的链接可以帮到你... 如何创建自定义安装程序

它对我很有帮助,我遇到了类似的情况(Word 2010 加载项 + Open XML SDK 2.0 - 部署在运行 Windows XP Service Pack 3 32 位到 Windows 7 Professional 64 位的机器上)。

希望它能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接