繁体   English   中英

DLL 参考仅在 NuGet 在服务器上还原后有效

[英]DLL Reference Only Works After NuGet Restore on Server

标题可能会更好,但我现在真的想不出更好的东西。 我在两台服务器之间遇到了一个非常奇怪的问题:Server1 和 Server2。

两者都是 Windows 2012 R2/IIS 8.5。 Server2 在构建时从 Server1 克隆而来,并且从那以后一直处于相同的补丁周期。

我最近对 Server1 部署了一个主要的代码更改,其中包括向我的解决方案添加一个新项目。 大多数解决方案的目标是 .NET Framework 4.6(这里和那里有一些较旧的位,但没有什么那么重要),但新项目的目标是 .NET 属性中的标准 1.3。 这个新项目的所有引用都列为 NuGet 包。

当我在本地计算机上编译并运行整个解决方案时,一切正常。 但是,当我将它部署到 Server1 时,只要代码到达引用 .NET Standard 1.3 项目代码的位置,我就会开始收到以下错误。

Could not load file or assembly 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

在尝试了我能想到的所有方法并在网上找到解决此问题的方法后,我最终能够通过在机器上安装 MSBuild 并运行msbuild -t:restore命令使其正常运行。 一旦它直接在服务器上运行,一切就开始工作了。

我认为部署过程可能缺少一个步骤,所以当我将所有代码移至 Server2 时,我实际上将整个代码库按原样从 Server1 移至 Server2。 我什至没有依赖自己的部署过程,因为担心这是问题的原因。

果然,一旦在 Server2 上运行代码,我又看到了完全相同的错误。 在这一点上,我在 Server2 上唯一没有做的事情就是运行该命令,虽然它可能会为这些开发机器修复它,但我并不是特别渴望在我们的生产服务器上安装像 MSBuild 这样的程序来修复这个问题。

所以现在我的问题是:有谁知道我在这里是否遗漏了什么? 我承认,我并不完全理解 NuGet,所以我不确定为什么msbuild -t:restore命令可以解决这个问题。 有没有什么方法可以复制此命令在可以合并到部署过程中的文件结构或配置级别上执行的操作?

或者...我是否应该不再担心将 MSBuild 放在生产服务器上,并让服务器上的构建活动成为我们常规部署过程的一部分?

请注意:我不向任何遇到此问题的人推荐以下解决方案,该应用程序本应长期存在并不断增强。 这对我们来说是一个可行的选择的唯一原因是因为主要应用程序将很快达到 EOL,并且代码库不希望在完全取消之前通过任何更多的主要增强或集成来实现 go。

事实证明,解决方案是将 NuGet 添加到我们的核心应用程序(它从未真正使用过 NuGet 并且仅依赖于手动引用),然后强制核心应用程序将其自己的 System.Net.Http 和 System.Diagnostics.DiagnosticSource 包降级为.NET 标准 1.3 目标项目使用的包。 我对这种方法不是特别满意,因为如果我们需要升级任何东西,它会为我们前进带来很多问题,但就当前项目而言,它会起作用。

我仍然对为什么使用 Web.Config 绑定对此不起作用感到有点困惑。 据我了解,如果我使用下面的代码,我就不必担心降级或升级库引用,并且 .NET 将根据显示的绑定设置处理引用调用的指向。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Net.Http" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
                <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

我们甚至尝试使用 4.1.1.3 和 4.1.1.0 的新版本(具有适当的 DLL 更改),但它们都不起作用。 应用程序完全忽略配置中的这一行的潜在现实是我们关心的另一个问题,但幸运的是,正如上面的注释所述,我们不必再担心这个应用程序了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM