我正在使用 Azure Functions,但遇到了涉及 NuGet“Microsoft.Extensions.Logging.Abstractions”的问题。我的解决方案运行得非常好,但最近我添加了一个依赖于“Microsoft.Extensions.Logging.Abstractions 5.0.0”的依赖项。该项目构建良好,但是当我运行它时。出现以下错误:“无法加载文件或程序集 'Microsoft.Extensions.Logging.Abstractions,版本 = 5.0.0.0”。
我在Github 问题上找到了一些与此相关的信息。我发现的建议是:
- 将“Microsoft.Extensions.Logging.Abstractions”降级到版本 3.1.0。我不能这样做,因为我有一个第三方依赖项,它引用了相同的 NuGet,但版本为 5.0.0。
- 升级到 .NET 5.0。我不能这样做,因为我需要使用 Durable Functions,而带有 .NET 5.0 的 Azure Functions 尚不支持这些功能。
我也尝试使用同一个 NuGet 的多个版本,但我得到了同样的错误(我尝试了这个链接中提到的方法)。
有没有办法解决这个问题?
更新:我创建了一个可以重现问题的最小示例。它位于这里。分支功能/WithLogging3按预期运行,但功能/WithLogging5失败并显示消息“'主机尚未启动”。如果我启用使用公共语言运行时异常中断调试器的选项,我会收到错误消息“无法加载文件或程序集'Microsoft.Extensions.Logging.Abstractions,版本 = 5.0.0.0,文化 = 中性,PublicKeyToken = adb9793829ddae60'。该系统找不到指定的文件”。
似乎只有在将 ILogger 注入函数时,该项目才会失败。例如,这个(直接取自 Visual Studio 2019 Template for Azure Functions with .NET Core 3.1):
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
string responseMessage = string.IsNullOrEmpty(name)
? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
: $"Hello, {name}. This HTTP triggered function executed successfully.";
return new OkObjectResult(responseMessage);
}
如果我删除注入的 ILogger(以及方法中使用记录器的行),则项目运行良好。但是,我需要使用记录器。
我知道我提供的示例不包含持久函数,但它重现了该问题,即使您将持久函数添加到项目中,或者将当前函数替换为需要注入的持久函数,它也会重现记录仪。
顺便说一句,如果它有任何改变,我使用的是 Visual Studio 2019(企业版)。