由于绑定重定向,无法加载 DLL



我有一个使用 SendGrid Nuget 包的 DLL 项目。SendGrid 包需要 nuget 包 System.Net.Http 4.3.4。然后,我已将此 DLL 项目打包到 Nuget 包中。

现在,我有一个 ASP.NET MVC 项目,其中包括我的 Nuget 包。由于依赖关系要求,安装它会安装SendGrid,System.Net.Http和其他依赖关系。

现在,当我让我的 Web 应用程序尝试发送电子邮件时,我收到以下错误。

System.IO.FileNotFoundException
HResult=0x80070002
Message=Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
Source=Bc3.Mail
StackTrace:
at Bc3.Mail.MailHelper.SendMessage(SendGridMessage message) in C:CodeShared LibrariesBc3.MailBc3.MailMailHelper.cs:line 166
at Bc3.Mail.MailHelper.SendMail(MailMessage mail) in C:CodeShared LibrariesBc3.MailBc3.MailMailHelper.cs:line 128
…

现在,我很困惑,因为我认为安装了 4.3.4 版。我检查了我所有项目中的System.Net.Http版本,它说它是4.2.0.0版本。好的,我很困惑为什么当我认为我安装了 4.2.4 时它会显示 4.3.4。但是,如果在我的项目中引用了 4.2,它怎么可能找不到它?

无论如何,接下来我查看了我的 web.config 文件并看到了这个

<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/>
</dependentAssembly>

我对这些绑定重定向一无所知。但我决定删除它,一切正常。

所以我的问题是为什么?

谢谢

关于绑定重定向

绑定重定向允许运行时选择特定程序集的替代版本。绑定重定向可能很有用,因为它们降低了绑定到程序集的特定版本的严格性。但是,它们可能带来冲突。

https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/redirect-assembly-versions

添加发送网格后的绑定重定向

我注意到添加对SendGrid的 NUGET 引用插入了以下绑定重定向

<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
</dependentAssembly>

创建使用 SendGrid 的 NUGET 包

我创建了一个引用 SendGrid 的简单类库项目并制作了一个 NUGET 包。我将此 NUGET 包放在我的专用源文件夹中,然后从另一个框架项目中引用此 NUGET 包。 编译的 .CONFIG 文件具有以下绑定重定向

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>

可能性

我的想法:

  1. 您在web.config中看到的绑定重定向可能是由对其他某个NUGET包的无意引用引起的
  2. 允许编译器在生成操作期间生成绑定重定向,而不是在 Web.config 或 app.config 中手动添加绑定重定向。 应选中"项目"设置-->"应用程序"选项卡-->自动生成绑定重定向。

希望这有帮助。

看起来有些事情搞砸了。 当您的任何 2 个 nuget 包需要不同版本的 Net.HTTP 时,绑定重定向将放在那里。 或者您手动安装了 4.2。 这将使所有对 Net.Http 的引用都使用 4.2 版本。

这就是正在发生的事情,只是你的项目中似乎不再有 Net.Http 4.2。似乎此重定向不小心被以某种方式留下(可能是 git 或其他东西在尝试更改文件时锁定了文件?

最新更新