我知道这篇文章是很久以前的了,但我想我还是要花两分钱,以防有人偶然发现它。
一般的经验法则是在开发中使用与您计划支持的最旧版 Office 关联的 PIA 版本。因此,如果您要支持 Office 2007 及更高版本,请在开发期间使用 PIA 版本 12。
添加对 v12 PIA 的引用(通过在线、通过 VSTO 或从 GAC 下载 2007 PIA(如果您之前已经拥有 Office 2007)。现在您可能会想“好的,我在 Visual Studio 中引用 v12,现在应该可以在 Office 2007 上使用”。错误的。由于您引用的是 v12 但您安装了 Office 2010,因此在程序集绑定期间您的计算机会说“嗯,请求 v12,但我们在 GAC 中安装了 v14,并且由于 PIA 向前兼容,我们将使用它”。即使您明确告诉它使用 v12,在构建完成后,您的机器仍将使用 v14。您可以通过FUSLOG 确认这一点。 FUSLOG 是处理程序集绑定时使用的出色工具。 注意:如果您在 FUSLOG 中没有看到任何内容并且您认为应该看到,请清除 Internet Explorer 历史记录中的所有内容,然后重试。
要解决此问题,您需要停止所谓的“assembly binding redirection”。这些 PIA 通常在 GAC 中有一个策略文件。策略文件的目的是在解析程序集时将旧 PIA 版本重定向到新版本。要查看此内容,请执行以下操作:
- 按 'Windows 键 + R' 打开运行菜单。
- 键入“C:\Windows\Assembly\GAC”并按 Enter。
注意:我运行的是 32 位机器。您的 PIA 很可能会安装在 GAC 中的其他位置,例如“C:\Windows\Assembly\GAC_MSIL”。
进入 GAC 后,向下滚动并查找您引用的 PIA 文件夹(例如 Microsoft.Office.Interop.Excel)。如果继续滚动,您应该会看到以“Policy”开头的文件夹,然后是一个数字,然后是 PIA 的名称(例如 Policy.12.0.Microsoft.Office.Interop.Excel)。这是执行绑定重定向的策略文件。打开该文件夹中的 XML 配置文件,您将看到类似于以下内容:
<?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>
在上面的代码sn-p中,标签"bindingRedirect oldVersion ..."负责PIA程序集重定向。如果您像下面这样注释掉该代码:
<?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>
然后这个重定向将被忽略。我评论它而不是删除只是因为该文件确实有很好的用途,而不是在为旧版本的 Office 开发时。对您需要的每个 PIA 策略文件执行此操作,您的开发机器将停止重定向。
希望这能回答你的问题!