Google api 如何在Vsix扩展中执行dll绑定重定向?

Google api 如何在Vsix扩展中执行dll绑定重定向?,google-api,app-config,vsix,Google Api,App Config,Vsix,我有一个VS的扩展,应该使用Gmail api向我公司的某些用户发送邮件。 在开发过程中,我遇到了一个常见的问题,就是System.Net.Http.Primitives版本在Google API中不知怎么搞砸了 这样做的目的是将bindingRedirect放入app.config中,将所有调用重定向到库的最新版本。如下图所示: <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

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

这样做的目的是将
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
文件中,但我的扩展名被其他人使用,我不想强迫他们将内容放入机器配置文件中


是否有其他解决方案?

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

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


您可以尝试的一种方法是通过代码以某种方式强制程序集解析失败(订阅AppDomain.AssemblyResolveEvent)来重定向绑定,以获得提供所需确切程序集的机会。请参阅:

这一问题在一年多前得到了解答,但我找到了一个更好的方法,使用
providedBindingRedirectionAttribute
。这将向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”)]


很好的信息,这提供了提示重定向。但是,它会影响Visual Studio配置,而不仅仅是VSIX。特别是,我们的VSIX需要对NuGet程序集进行重定向,这会导致Visual Studio中的包还原支持失败…

不幸的是,如果
OldVersionUpperBound
NewVersion
,这将不起作用,您可以在app.config文件中执行。