首页 > 解决方案 > 依赖的依赖;.net Core 3.0 中的 Framework 4.6.2 依赖项

问题描述

我有一个面向 .Net Framework 4.6.2 (x86) 的第三方库。我在 x64 Windows 机器上,安装了 x86 sdk。我需要弄清楚是否/如何在我的 aspnetcore3.0 项目中使用这个库。有人可以在考虑以下考虑因素的情况下阐明一种方法吗?

我在我的 csproj 文件中为 Asp.Net Core 3.0 项目包含Reference了外部库。HintPath我目前正在发布为依赖于框架的部署 (FDD)。

该库的某些元素似乎可以正常工作,而其他方法则出错。据我所知,该库的Initialize方法用于System.Data.SqlClient连接到 MSSQL 源。我已经包含了BackgroundService在添加到ConfigureServices. 当代码达到这一点时,它会出错:

The ConnectionString property has not been initialized
   at System.Data.SqlClient.SqlConnection.PermissionDemand()
   at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteReader(String connectionString, CommandType commandType, String commandText, SqlParameter[] commandParameters)
   at Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteReader(String connectionString, CommandType commandType, String commandText)
   at Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteReader(String connectionString, String spName, Object[] parameterValues)
... (proprietary library methods call to database)

这个库的一个限制是调用可执行文件需要Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)从特定的“特殊”目录运行(per)。我们称之为 C:\MySpecialProgram\CustomApiCode。这是一个静态定义的位置,我还没有确定解决它的方法。此文件夹包含 DLL 和其他几个相关的 DLL。我之前曾尝试将其发布为单个、自包含的可执行文件,但可能由于与如何卸载此“包”有关的原因,库报告它没有从特殊目录运行。

我已经尝试从命令行从 VS2019 发布,指定 x86 dotnet.exe 而不是。它们似乎都产生了略微不同的错误(原因可能很明显。

除了上面的ConnectionString错误,我经常得到:Could not load file or assembly {insert some System library here}. The located assembly's manifest definition does not match the assembly reference. 一开始它调用了System.Data.SqlClient,所以我通过NuGet添加了它来尝试缓解它。现在它似乎令人窒息System.Text.Encoding.CodePages, Version=4.1.2.0/感觉有点像 wack-a-mole,表明我的方法全错了。

标签: c#asp.net-core.net-coredependencies

解决方案


.NET Core(任何版本)在技术上不支持 .NET Framework 库。由于 .NET Core 2.0+ 实现了 .NET Standard 2.0,而 .NET Framework 4.6.1+ 实现了 .NET Standard 2.0,微软在编译器中做了一个例外以允许包含 .NET Framework 库,但需要注意的是它们实际上可能会也可能不会工作。在引用该库时,您实际上应该已收到有关此效果的警告。

.NET Core 实际上支持大多数 .NET Framework 功能,但很多东西不支持,尤其是特定于 Windows 的 API。如果库最终无法正常工作(因为它使用了 .NET Core 不支持的 API),则没有解决方法。您根本无法使用该库。就那么简单。

这只是添加的一种便利,因为那里有大量的 .NET Framework 库,其中许多库不再处于积极开发中,但实际上可以与 Core 一起正常工作。不保证最终支持,无论是明示的还是其他的。

也就是说,ASP.NET Core <3.0 的早期版本实际上可以改为以 .NET Framework 为目标。这将允许您使用 .NET Framework 库,即使它们与 Core 不兼容,因为您实际上是针对 .NET Framework,而不是 .NET Core。但是,.NET Core 3.0 实现了 .NET Standard 2.1,任何版本的 .NET Framework 都不会这样做或永远不会这样做。因此,您不能再将 .NET Framework 与 ASP.NET Core 3.0 应用程序结合使用。如果您必须使用这些库,您可以构建面向 .NET Framework 的 ASP.NET Core 2.2 应用程序,但在您离开这些旧库之前,您将永远停留在 2.2 版本。


推荐阅读