随着新版本的系统包发布,若你恰巧使用采用了新版本的库进行开发,.NET可能会变得非常麻烦。新版本包含一些库使用的额外API,如果你使用旧版本,你的程序可能仍然可以运行,但是在运行时会因为旧的DLL不包含特定定义方法而崩溃,报错MethodNotFoundException
。
即使你发布了最新版本,你仍然可能会遇到问题。例如,一个库使用System.Net.Http 4.2.0.0,另一个库使用System.Net.Http 4.3.0.0,而你将4.3.0.0与应用一同发布,使用4.2.0.0的库将寻找完全相同的4.2.0.0版本,并且由于你未包含相同的版本,它将使你的程序崩溃。 .NET团队预见到了这一点,并允许你的程序将4.2.0.0 重定向至4.3.0.0,这被称为绑定重定向。
当你有很多绑定重定向时,手动管理将变得不可能。
最好的方法是让计算机自动为你完成这个过程。更新.csproj
文件,使其包含AutoGenerateBindingRedirects
标签。
<Project>
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
</Project>
接下来,更新你的
app.config
或
web.config
文件,并移除所有绑定重定向。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
当您构建应用程序并检查 bin\Debug\YOURAPP.exe.config
时,您会发现自动添加了绑定重定向,以便所有库都查找单个DLL版本。
Web应用程序的附加步骤
如果您有一个 web.config
,则过程是不同的。由于需要将 Web.config 发送到生产机器,因此需要添加正确的程序集绑定重定向。 Visual Studio 将计算所需的程序集绑定重定向并显示构建警告。
当您双击构建警告时,将在您的 web.config 中添加正确的程序集绑定重定向。
附加检查
如果您使用 packages.config
,则应检查您的 .csproj
是否引用了在 packages.config
中定义的相同 nuget 版本。
但是,如果您正在构建 .exe 而不是 Web 应用程序,则建议将项目转换为使用 PackageReference。Visual Studio 将自动确保引用相同的版本,您无需进行检查。
4.2.1.0
,这显然是nuget 4.3.4的dll版本。然后我手动将dll从packages文件夹复制到我的bin目录,但它显示“找到的程序集清单定义与程序集引用不匹配”。有什么想法可能发生了什么? - imlokesh