私有 nuget 引用在运行时中断 .NET Core 2 webapp
Private nuget reference break .NET Core 2 webapp at runtime
情况是这样的。
我有 2 个用 .NET 标准 2.0 编译的简单 dll(出于兼容性原因)。
第一个(我们称它为 A)除了 NETStandard.Library (2.0.3) 之外没有外部引用。第二个(我们称之为 B)引用 Microsoft.Extensions.Loggin.Abstractions (5.0.0)、Newtonsoft.Json (13.0.1),当然还有 NETStandard.Library (2.0.3)。编译和 运行(本地单元测试)都没有错误。
因为我需要在多个项目中共享它们,所以我使用私有 GitHub 包存储库;我能够从 Visual Studio 中的 NuGet 包管理器获取它们。由于 GitHub 操作,NuGets 创建和部署已完成。
目前在 .NET Core 3.1 REST 项目中使用这两个 dll 没有任何问题。
当我尝试在 .NET Core 2.2 REST 项目中使用它们时出现问题:虽然本地一切正常(调试),但在发布和部署之后我发现 dll B 破坏了整个应用程序不知何故。
应用程序启动但对 REST 服务的每个请求都没有收到任何响应(我认为它永远不会到达端点,说实话)。文本文件和事件查看器中的应用程序或 IIS 没有 logs/errors。
我发现这与代码无关,因为在不使用任何方法的情况下引用 dll B 足以破坏整个事情。
A dll 完全没有问题。
这是我试过的(顺序不完全一样):
- 删除了所有引用并注释了 B 中的每一行代码 -> 仍然破坏了应用程序(这让我意识到这不是代码或引用问题)
- 这次从另一个项目中引用了它:WebApp .NET Core 2.0 -> 仍然破坏了应用程序
- 从 .NET Core 2.2 中的全新空项目(Visual Studio 用作起始模板的 Weather REST 服务)引用它 -> 完全没有问题
- 添加到 Weather REST 服务的所有其他应用程序的依赖项(以发现任何不兼容)-> 仍在处理 Weather 项目
- 手动创建并推送 NuGet 包 -> 仍然破坏应用程序
- 部署在两台不同的机器上(一台内部机器和一台 AWS)-> 仍然在两台机器上破坏应用程序
- 将其引用为本地程序集(而不是来自 NuGet)-> 有效!
因此,即使是对空 dll 的 NuGet 引用也会破坏应用程序,而本地程序集则不会。这不是 framework/environment 问题,因为新的 .NET Core 2.2 项目和另一个 .NET Core 3.1 项目运行良好(在同一台机器上)。
这不是 .NET Standard 编译问题,因为 A dll 遵循完全相同的部署方法并且它在任何地方都有效。
没有抛出错误。
调试时一切正常。
我很绝望。有什么建议吗?
谢谢
我终于想通了,虽然有些地方还是不清楚。
我在 .NETCore2.2 中的项目使用 AspNetCore.All 特定版本(2.2,根据框架)并包含一些 Microsoft.Extensions.Logging dll。
我的 B dll 引用 Microsoft.Extensions.Logging.Abstractions 5.0:下载 B 作为 NuGet 使包管理器解析引用,所以基本上我在我的应用程序中使用 v5.0,而应用程序正在寻找框架中的 v2.2(可能在 GAC 中,这可以解释为什么具有相同引用的全新应用程序运行良好)。
所以我用
解决了
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
//Log everything here
}
我发现它抛出了一个关于 class 我根本没有使用的 的错误; class 存在于 Logging.Abstractions 5.0 中,但不存在于 2.2 中。
因为我不需要 5.0 的任何功能,所以我将其降级为 2.0,现在它非常有用。
仍然不知道为什么事件查看器中没有记录异常。
情况是这样的。
我有 2 个用 .NET 标准 2.0 编译的简单 dll(出于兼容性原因)。 第一个(我们称它为 A)除了 NETStandard.Library (2.0.3) 之外没有外部引用。第二个(我们称之为 B)引用 Microsoft.Extensions.Loggin.Abstractions (5.0.0)、Newtonsoft.Json (13.0.1),当然还有 NETStandard.Library (2.0.3)。编译和 运行(本地单元测试)都没有错误。
因为我需要在多个项目中共享它们,所以我使用私有 GitHub 包存储库;我能够从 Visual Studio 中的 NuGet 包管理器获取它们。由于 GitHub 操作,NuGets 创建和部署已完成。
目前在 .NET Core 3.1 REST 项目中使用这两个 dll 没有任何问题。
当我尝试在 .NET Core 2.2 REST 项目中使用它们时出现问题:虽然本地一切正常(调试),但在发布和部署之后我发现 dll B 破坏了整个应用程序不知何故。
应用程序启动但对 REST 服务的每个请求都没有收到任何响应(我认为它永远不会到达端点,说实话)。文本文件和事件查看器中的应用程序或 IIS 没有 logs/errors。
我发现这与代码无关,因为在不使用任何方法的情况下引用 dll B 足以破坏整个事情。
A dll 完全没有问题。
这是我试过的(顺序不完全一样):
- 删除了所有引用并注释了 B 中的每一行代码 -> 仍然破坏了应用程序(这让我意识到这不是代码或引用问题)
- 这次从另一个项目中引用了它:WebApp .NET Core 2.0 -> 仍然破坏了应用程序
- 从 .NET Core 2.2 中的全新空项目(Visual Studio 用作起始模板的 Weather REST 服务)引用它 -> 完全没有问题
- 添加到 Weather REST 服务的所有其他应用程序的依赖项(以发现任何不兼容)-> 仍在处理 Weather 项目
- 手动创建并推送 NuGet 包 -> 仍然破坏应用程序
- 部署在两台不同的机器上(一台内部机器和一台 AWS)-> 仍然在两台机器上破坏应用程序
- 将其引用为本地程序集(而不是来自 NuGet)-> 有效!
因此,即使是对空 dll 的 NuGet 引用也会破坏应用程序,而本地程序集则不会。这不是 framework/environment 问题,因为新的 .NET Core 2.2 项目和另一个 .NET Core 3.1 项目运行良好(在同一台机器上)。 这不是 .NET Standard 编译问题,因为 A dll 遵循完全相同的部署方法并且它在任何地方都有效。 没有抛出错误。 调试时一切正常。
我很绝望。有什么建议吗?
谢谢
我终于想通了,虽然有些地方还是不清楚。
我在 .NETCore2.2 中的项目使用 AspNetCore.All 特定版本(2.2,根据框架)并包含一些 Microsoft.Extensions.Logging dll。
我的 B dll 引用 Microsoft.Extensions.Logging.Abstractions 5.0:下载 B 作为 NuGet 使包管理器解析引用,所以基本上我在我的应用程序中使用 v5.0,而应用程序正在寻找框架中的 v2.2(可能在 GAC 中,这可以解释为什么具有相同引用的全新应用程序运行良好)。
所以我用
解决了AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
//Log everything here
}
我发现它抛出了一个关于 class 我根本没有使用的 的错误; class 存在于 Logging.Abstractions 5.0 中,但不存在于 2.2 中。
因为我不需要 5.0 的任何功能,所以我将其降级为 2.0,现在它非常有用。
仍然不知道为什么事件查看器中没有记录异常。