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

Grz*_*cki 7 app-config google-api vsix

我有VS的扩展,应该使用Gmail api向我公司的某些用户发送邮件.在开发过程中,我遇到了一个常见问题,该System.Net.Http.Primitives版本在谷歌API中被搞砸了.

对此的常见解决方案bindingRedirect在app.config中将redirectall调用重定向到新的最新版本的库.如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

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

我知道一个解决方案,说添加bindingRedirectmachine.config文件但我的扩展名被其他人使用,我宁愿不强迫他们把东西放入他们的机器配置文件.

还有其他解决方案吗?

Tay*_*ick 19

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

通过使用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")]

  • 不幸的是,如果 `OldVersionUpperBound` &gt; `NewVersion` 则不起作用,这是您可以在 app.config 文件中执行的操作。 (2认同)

Car*_*ero 4

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

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

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