Зависимость от зависимости;Framework 4.6.2 зависимости в .net Core 3.0 - PullRequest
1 голос
/ 17 октября 2019

У меня есть сторонняя библиотека, предназначенная для .Net Framework 4.6.2 (x86). Я на машине с Windows x64, с установленным x86 sdk. Мне нужно выяснить, можно ли / как использовать эту библиотеку в моем проекте aspnetcore3.0. Может ли кто-нибудь объяснить подход, учитывающий приведенные ниже соображения?

Я включил внешнюю библиотеку как Reference с HintPath в мой файл csproj для проекта Asp.Net Core 3.0. В настоящее время я публикуюсь как зависящее от фреймворка развертывание (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 / Похоже на дурацкий моль, свидетельствующий о том, что мой подход неверен.

1 Ответ

1 голос
/ 17 октября 2019

.NET Core (любая версия) технически не поддерживает библиотеки .NET Framework. Поскольку .NET Core 2.0+ реализует .NET Standard 2.0, а .NET Framework 4.6.1+ реализует .NET Standard 2.0, Microsoft сделала исключение в компиляторе, чтобы разрешить включение библиотек .NET Framework с оговоркой, что они могут или не могут на самом деле работа. На самом деле вы должны были получить предупреждение об этом при обращении к библиотеке.

Наибольшее большинство функциональных возможностей .NET Framework фактически поддерживается в .NET Core, но многие вещи не поддерживаются, особенно API-интерфейсы, специфичные для Windows. Если библиотека не работает (потому что использует API, не поддерживаемые .NET Core), обходного пути не существует. Вы просто не можете использовать эту библиотеку. Все просто.

Это просто удобство, которое было добавлено, потому что существует множество библиотек .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. Если вы <em>должны использовать эти библиотеки, вы можете создавать приложения ASP.NET Core 2.2, ориентированные на .NET Framework, но вы навсегда останетесь на 2.2, пока не удалите эти старые библиотеки.

...