摘要
.NET在诞生之初就宣称要解决“DLL地狱”的痛点,经过20多年的发展,除了目前有.NET Framework、.NET Standard和.NET三套框架之外,传统的ASP.NET Web应用程序经常碰到dll版本不一致的问题。通过web.config中设置绑定重定向可以解决问题。但是维护这个绑定重定向的配置,会给程序员带来麻烦。尤其有时候在本地Visual Studio中和Gitlab CI中发布web项目,同一个DLL版本号竟然不一致。所以我写了这个小工具。
这个小工具诞生的迫切性
我的ASP.NET Web程序引用了3个包,截图如下:
上图中3个包的版本很清晰,但是在本地调试的时候,每次都提示主版本不一致,停止检测:
非得web.config中配置如下,才能工作:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.2.7.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.2.7.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="3.6.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
用Gitlab CI在服务器上自动发布后,web.config中配置如下,改回和包的版本号一致,才能工作:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.3.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" culture="neutral" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="4.1.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
于是萌生了写这个小工具的念头。
效果图
在本地运行
上图中带了--project参数,指定了项目文件的精确路径。
上图中显示了自动去除重复的配置。
如果您的配置完全正确,提示如下:
在Visual Studio 2022的终端
这里是在当前目录直接运行。程序会在当前目录下搜索web.config或者App.config。
在Gitlab CI流水线中运行
不足之处是控制台里的输出没有颜色了。
上图还是在.gitlab-ci.yml里调用了PowerShell的脚本文件,脚本文件里面执行C#程序,才能得到文字输出。
如果直接在.gitlab-ci.yml里调用C#程序执行,连一个字的输出都看不到。
核心代码
即将开源在Gitee和Github。
黑夜里不停折腾的代码行者。