我有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
文件,但我的扩展程序被其他人使用,我宁愿不强迫他们将内容放入他们的计算机配置文件中
还有其他解决办法吗?
答案 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中的程序包还原支持失败...