【问题标题】:Dependency of dependency; Framework 4.6.2 dependencies in .net Core 3.0依赖的依赖; .net Core 3.0 中的 Framework 4.6.2 依赖项
【发布时间】:2020-02-14 17:10:58
【问题描述】:

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

我已将外部库作为 ReferenceHintPath 包含在我的 asp.Net Core 3.0 项目的 csproj 文件中。我目前正在发布为依赖于框架的部署 (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))。我们称之为 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,表明我的方法全错了。

【问题讨论】:

  • 顺便说一句,我很好奇这个库做了什么,如果有更现代的版本和/或更新的库来做同样的事情。根据您描述的需要特定路径等问题...听起来有点像垃圾,我很想消除。
  • 如果...它是供应商为我们企业中的关键软件提供的 API。这是一个必要的邪恶,我坚持使用它。在这一点上没有更好的选择。我能做的最好的就是完全避开它,直接访问数据库。出于显而易见和非显而易见的原因,这是不可行的。
  • 刚刚在同一个项目中混合了 .NET Core 和完整的 .NET Framework DLL 已经经历了数周的不良事件,考虑将完整的 .NET 框架代码托管在单独的进程中,在 WebAPI 等后面,具有适当的防火墙保护,以便完整的 .NET 框架代码可以在完整的 .NET 框架进程内运行。在同一个应用程序中混合完整的 .net 和 .net 核心据说是可行的,但是我的团队在放弃并在不同的 EXE 进程中运行它们之前浪费了几个月的时间。

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


【解决方案1】:

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

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

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

也就是说,ASP.NET Core 必须使用这些库,则可以构建面向 .NET Framework 的 ASP.NET Core 2.2 应用程序,但在您离开这些旧库之前,您将永远停留在 2.2 版本。

【讨论】:

  • 我只是在想 SqlClient 不会太重而无法兼容。我尝试从 2.1 定位 462(我已经在 3.0 之前的 2.1 上构建了它)但没有任何乐趣。我放弃。我将构建一个单独的 .net 框架组件,该组件将使用 SignalR 与 asp.net 核心服务器通信。下一个障碍是让 .net 框架 signalr 客户端与该 .net 核心 signalR 服务器通信。我知道它们不一定兼容......但我听说如果我将 TransportType 指定为 WebSockets,Microsoft.AspNetCore.SignalR.Client 将对我有用。
猜你喜欢
  • 2021-03-22
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2020-07-08
  • 2018-03-03
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多