При вызове библиотеки классов я получаю сообщение об ошибке system.data.sqlclient не поддерживается на этой платформе.
Вот настройка, когда я получаю эту ошибку:
Проект "основной" на базе Core 3.1 и типа консольного приложения. Не имеет ссылки на System.Data.SqlClient и не нуждается в ней.
Он вызывает проект «процесс», также основанный на Core 3.1 библиотеки классов типов. Не имеет ссылки на System.Data.SqlClient и не нуждается в ней.
«Процесс» вызывает проект «сервис» на основе Core 3.1 библиотеки классов типов. Этот проект нуждается в System.Data.SqlClient и имеет ссылку на пакет «System.Data.SqlClient (4.5.1)».
При отладке «основного», когда он попадает в «сервис», при первом обращении к SqlConnection возникает ошибка с сообщением «system.data.sqlclient не поддерживается на этой платформе».
Почему я получаю эту ошибку и как ее исправить.
Примечание. Когда я добавляю ссылку на System.Data.SqlClient в проект "main" - ошибки нет, но, конечно, поскольку "main" не нуждается в System.Data.SqlClient, у него не должно быть такового.
Когда я тестирую «сервис» с помощью xUnit, ошибок нет, все работает нормально
Спасибо
1 ответ
Согласно документу:
Пакет Microsoft.Data.SqlClient NuGet включает несколько библиотек DLL, поддерживающих разные цели .NET и разные платформы среды выполнения. Если вы получаете исключение PlatformNotSupported, хотя, по вашему мнению, этого не должно быть, в конечном итоге это означает, что ваше приложение не загружает соответствующую DLL. Для этого может быть ряд причин. Структура и инфраструктура пакета NuGet для ссылок и загрузки пакетов NuGet, на которые есть ссылки, включает логику, которая позволяет пакету содержать несколько библиотек DLL, реализующих поддержку различных целей .NET и платформы. Это означает другую библиотеку DLL для .NET Framework, .NETCore, .NET Standard, Windows, Linux и т. д. Инфраструктура NuGet будет автоматически ссылаться на соответствующую библиотеку DLL и загружать ее в зависимости от потребностей вашего приложения.
Если ваше приложение напрямую загружает DLL из пакета NuGet, оно обходит всю эту логику и, вероятно, загружает неправильную DLL. Библиотека DLL в пакете NuGet в папке lib/netstandard2.0/Microsoft.Data.SqlClient.dll, по сути, является резервной библиотекой DLL для любой неподдерживаемой цели и просто создает исключение PlatformNotSupported для любого вызова. Это более приятное исключение, чем то, что вы могли бы получить при работе на платформе, для которой не создана библиотека DLL. В конечном счете, вы хотите использовать эталонную инфраструктуру пакетов NuGet, иначе вам придется самостоятельно реализовывать всю эту целевую платформу и логику поддержки платформы при определении того, какую DLL загружать.
Кроме того, пакет NuGet содержит всю информацию о зависимостях для библиотеки SqlClient и упрощает загрузку зависимостей и ссылки на них. Если вы ссылаетесь на отдельную библиотеку DLL и загружаете ее вручную, вы должны убедиться, что все зависимости также доступны для библиотеки SqlClient.
Я предлагаю вместо этого попробовать использовать Microsoft.Data.SqlClient. Подробнее о шпаргалке по портированию с System.Data.SqlClient на Microsoft.Data.SqlClient вы можете прочитать в этой статье.