如何在Vsix扩展中执行dll bindingRedirect?

时间:2015-07-06 12:37:32

标签: google-api app-config vsix

我有VS的扩展,应该使用Gmail api向我公司的某些用户发送邮件。 在开发过程中,我遇到了System.Net.Http.Primitives版本的常见问题,该版本在Google API中有些混乱。

common solution是将bindingRedirect放入app.config中,以将调用重定向到新的最新版本的库。如下所示:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
      <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

但是,如果我的输出是Vsix包,这似乎不起作用。生成的Vsix甚至没有app.config。

我知道有一个解决方案是将bindingRedirect添加到machine.config文件,但我的扩展程序被其他人使用,我宁愿不强迫他们将内容放入他们的计算机配置文件中

还有其他解决办法吗?

3 个答案:

答案 0 :(得分:17)

一年前就回答了这个问题,但我找到了一个更好的方法,使用ProvideBindingRedirectionAttribute。这会将绑定重定向添加到devenv,并确定正确的版本。详细信息可以在here找到,但相关部分在这里:

  

通过使用ProvideBindingRedirection属性,您可以指定用于安装升级到可扩展组件的绑定重定向。当您发布可扩展的Visual Studio组件时,此属性会阻止组件的用户必须安装旧版本的依赖组件。如果使用ProvideBindingRedirection属性,则无需手动更新exe.config文件以将旧程序集版本的用户重定向到新版本。   添加ProvideBindingRedirection程序集属性是将绑定重定向条目添加到pkgdef文件的简单方法。 pkgdef文件用于安装扩展名。

     

以下示例显示AssemblyInfo.cs或AssemblyInfo.vb文件中的ProvideBindingRedirection条目:

     

[assembly: ProvideBindingRedirection(AssemblyName = "ClassLibrary1", NewVersion = "3.0.0.0", OldVersionLowerBound = "1.0.0.0", OldVersionUpperBound = "2.0.0.0")]

答案 1 :(得分:2)

从技术上讲,app.config属于进程(.exe),而不属于dll。对于Visual Studio,它是位于C:\ Program Files(x86)\ Microsoft Visual Studio&lt; version&gt; \ Common7 \ IDE的devenv.exe.config文件。

但要修改该文件,您的扩展程序应安装管理员权限(即.msi或类似的安装程序技术)。我认为修改该文件不是一个好主意,因为它会影响其他扩展。

您可以尝试的一种方法是通过代码重定向绑定,以某种方式强制程序集解析失败,订阅AppDomain.AssemblyResolveEvent,以便有机会提供您想要的精确程序集。请参阅:http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/

答案 2 :(得分:0)

很好的信息,这个ProvideBindingRedirection。但是,它不仅会影响VSIX,还会影响Visual Studio的配置。特别是我们的VSIX需要重定向NuGet程序集,从而导致Visual Studio中的程序包还原支持失败...