Azure Functions 找不到它应该使用的 file/dll

Azure Function can't find a file/dll that it suppose to use

我有一个曾经运行良好的 azure webjob。当我添加并使用我工作的公司的内部 nuget 时,我收到以下错误:

Could not load file or assembly 'System.Threading.Tasks.Dataflow, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.

奇怪的是,内部 nuget 和之前默认存在于该项目中的 nuget 都使用 System.Threading.Tasks.Dataflow,版本=5.0.0.0

当 .NET 首次创建时,Windows-only .NET Framework,它有一个称为“强命名”的概念,它使程序集版本成为程序集标识的一部分(不仅仅是名称,而且还包括 public 键)。对于 .NET Framework,当 A.dll 引用 B.dll 时,在运行时 B.dll 的版本必须与编译时针对的 A.dll 版本相匹配。解决这个问题的方法是在 app.config 或 web.config 文件中使用绑定重定向。

对于 .NET Core,他们不再强制执行此操作,但他们仍然进行检查以确保在磁盘上找到的程序集版本高于编译时引用的版本。

这是相关的,因为您使用的是 Microsoft.NET.Sdk.Functions 版本 3.0.13,它面向 .NET 3.1。因此,我假设您的 Azure Functions 应用程序是 运行 on .NET Core 3.1。我不知道 .NET 3.1 运行时中 System.Threading.Tasks.Dataflow 的程序集版本是什么,但我希望它是 3.something.

版本

虽然 NuGet 包版本不必与程序集版本匹配,但主要(有时是次要)版本通常会匹配,尤其是对于 System.* packages/assemblies.

将 2+2 放在一起,您在 .NET Core 3.1 上 运行,它具有 System.Threading.Tasks.Dataflow.dll 版本 3.something,但您的 something.Kafka.dll 程序集是针对 System.Threading.Tasks.Dataflow.dll 版本 5.something 编译。由于编译时引用是运行时可用版本的更高版本,.NET 程序集加载器拒绝使用它。

现在有两个可操作的东西。

首先,您可以执行以下三项操作之一来修复您的项目。使用面向 .NET 5 或更高版本的较新版本的 Azure Functions。或者,使用不依赖于比 .NET Core 3.1 运行时提供的版本更高的 BCL(基本 class 库)程序集的 whatever.Kafka 程序包的旧版本。最后,我猜测 dll 不存在于项目的 bin 目录中的原因是因为这个问题:https://github.com/Azure/azure-functions-host/issues/5894

其次,联系这个Kafka包的包主,告知他们不需要使用Dataflow NuGet包。 .NET Core 1.0 将其内置到 BCL 中,因此只有 .NET Standard 和 .NET Framework 项目才需要该包。如果此 Kafka 包确实支持 .NET Framework 或 .NET Standard,那么如果他们将其 PackageReference 更改为包含 Condition=" '$(TargetFrameworkIdentifier) != '.NETCoreApp' ",则该包将仅在 .NET Framework 和 .NET Standard 中使用,并且 BCL 版本的包将用于 .NET Core 和 .NET 5 及更高版本。如果他们使用任何其他 System.* 包(运行时附带),他们也应该这样做。当然,如果包所有者拒绝将 Dataflow 作为包依赖项移除,或者如果有其他包将 Dataflow 作为可传递包引入,那么您就陷入困境了。但是通过将此告知 Kafka 包所有者,他们至少有机会改进他们的包。