Office 2007 PIA

我build立了一个应用程序,它使用COM Interop生成Excel。 它可以在我的用户机器上正常工作:Office 2007,Windows XP SP2。 现在我将其迁移到另一台机器,Office 2010,Windows 7 64位,并使用VS2008的Visual Studio 2010,仍然正常工作。 当我将它部署在我的用户机器上时,我遇到了问题,他们使用相同的Windows 7 64位,但Office 2007。

因此,如果我在Win7 64位和Office 2010计算机上安装Office 2007 PIA,请更改我的Visual Studio项目中的引用,是否可以解决问题?

我知道这个post是在一段时间后面的,但是我想我会把我的两分钱扔进去,以防有人绊倒它。

一般的经验法则是在开发中使用PIA版本,它与您计划支持的最旧版本的Office相连接。 因此,如果您打算支持Office 2007或更高版本,请在开发期间使用版本12的PIA。

添加对v12 PIA的引用(通过在线,通过VSTO下载2007 PIA,或者如果之前已经有Office 2007,则从GAC下载)。 现在你可能会想:“好的,我在Visual Studio中引用了v12,现在它应该可以在Office 2007上运行”。 错误。 由于您引用的是v12,但是您已经安装了Office 2010,所以在组装绑定期间,您的机器会说:“那么请求v12,但是我们已经在GAC中安装了v14,并且由于PIA向前兼容,我们将使用它”。 即使你明确地告诉它使用v12,在完成一个构build你的机器将使用v14。 你可以通过FUSLOG来确认。 使用程序集绑定时,FUSLOG是一个很好的工具。 注意:如果您在FUSLOG中没有看到任何内容,并且您认为应该清除Internet Explorer历史logging中的所有内容,然后重试。

要解决这个问题,你需要停止所谓的“ 程序集绑定redirect ”。 这些PIA通常在GAC中有一个政策文件。 策略文件的目的是在parsing程序集时将较旧的PIA版本redirect到较新的版本。 要查看此信息,请执行以下操作:

  1. 'Windows键+ R'打开运行菜单。
  2. input“ C:\ Windows \ Assembly \ GAC ”,然后按Enter键。 注意 :我正在运行一个32位机器。 您的PIA很可能会安装在GAC的不同位置,例如“C:\ Windows \ Assembly \ GAC_MSIL”。

进入GAC后,向下滚动并查找您引用的PIA文件夹(例如Microsoft.Office.Interop.Excel)。 如果继续滚动,您应该看到以“策略”开始的文件夹,然后是数字,然后是PIA的名称(例如Policy.12.0.Microsoft.Office.Interop.Excel)。 这是执行绑定redirect的策略文件。 打开该文件夹中的XMLconfiguration文件,您将看到类似于以下内容的内容:

<?xml version="1.0" encoding="UTF-16"?><configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity publicKeyToken="71e9bce111e9429c" name="Microsoft.Office.Interop.Excel" culture="neutral"></assemblyIdentity> <bindingRedirect oldVersion="12.0.0.0" newVersion="14.0.0.0"></bindingRedirect> </dependentAssembly> </assemblyBinding> </runtime> 

在上面的代码片段中,标签“bindingRedirect oldVersion …”负责PIA程序集redirect。 如果你注释掉如下代码:

 <?xml version="1.0" encoding="UTF-16"?><configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity publicKeyToken="71e9bce111e9429c" name="Microsoft.Office.Interop.Excel" culture="neutral"></assemblyIdentity> <!--<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>--> </dependentAssembly> </assemblyBinding> </runtime> 

那么这个redirect将被忽略。 我评论它,而不是删除只是因为该文件确实是一个很好的目的,而不是开发旧版本的Office时。 在您需要的每个PIA策略文件上执行此操作,您的开发计算机将停止redirect。

希望这回答你的问题!