.NET 5 MySql TypeInitializationException: CodeBase не поддерживается в сборках, загруженных из однофайлового пакета.
Простое консольное приложение, которое должно вставлять данные в базу данных MySql, не работает, если оно опубликовано с однофайловой конфигурацией:
dotnet publish -c Release -r linux-x64 -p:PublishSingleFile=true -o publish/ GarLoader.MySqlUploader
Если я тогда запустил (
./publish/GarLoader.MySqlUploader
), это не удается. Трассировка стека:
System.TypeInitializationException: The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception.
---> System.TypeInitializationException: The type initializer for 'MySql.Data.MySqlClient.MySqlConfiguration' threw an exception.
---> System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize
---> System.NotSupportedException: CodeBase is not supported on assemblies loaded from a single-file bundle.
at System.Reflection.RuntimeAssembly.get_CodeBase()
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.get_ConfigPaths()
at System.Configuration.ClientConfigurationHost.GetStreamName(String configPath)
at System.Configuration.ClientConfigurationHost.get_IsAppConfigHttp()
at System.Configuration.Internal.DelegatingConfigHost.get_IsAppConfigHttp()
at System.Configuration.ClientConfigurationSystem..ctor()
at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
--- End of inner exception stack trace ---
at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
at System.Configuration.ConfigurationManager.PrepareConfigSystem()
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at MySql.Data.MySqlClient.MySqlConfiguration..cctor()
--- End of inner exception stack trace ---
at MySql.Data.MySqlClient.MySqlConfiguration.get_Settings()
at MySql.Data.MySqlClient.Replication.ReplicationManager..cctor()
--- End of inner exception stack trace ---
at MySql.Data.MySqlClient.Replication.ReplicationManager.IsReplicationGroup(String groupName)
at MySql.Data.MySqlClient.MySqlConnection.Open()
at SqlWorker.ASqlWorker`1.Exec(String command, DbParametersConstructor parameters, Nullable`1 timeout, CommandType commandType, IDbTransaction transaction)
at GarLoader.MySqlUploader.Inserter`1.InsertAddressObjectTypes(String connectionString, IEnumerable`1 items)
at GarLoader.MySqlUploader.Inserter`1.InsertItems(String connectionString, IEnumerable`1 items)
at GarLoader.MySqlUploader.UploaderToMySql.InsertAddressObjectItems[T](IEnumerable`1 items)
at GarLoader.Engine.Updater.LoadGlobalEntry[T](ZipArchive arch, String entryBeginingSubname, Func`2 prepareItem)
at GarLoader.Engine.Updater.Update(DownloadFileInfo downloadFileInfo)
at GarLoader.Engine.Updater.Update()
Он отлично работает, если его запускает
dotnet run
без публикации.
Есть ли обходной путь, чтобы я мог создать его как однофайловое приложение и запустить?
2 ответа
Укороченная версия
Используйте вместо Oracle
MySql.Data
.
Почему
Я подозреваю, что вы используете драйвер Oracle MySQL / Connector. У этого драйвера есть несколько проблем, и его использование - одна из меньших.
System.Configuration.ConfigurationManager
является частью .NET Framework, тогда как .NET 5 на самом деле является .NET Core 5. Чтобы использовать его, вы должны установить библиотеку совместимости, предназначенную только для облегчения миграции приложений .NET Framework, которые использовали
app.config
. Вместо того, чтобы выпустить надлежащий пакет .NET Core, Oracle просто перенаправила пакет .NET Framework с помощью библиотек совместимости.
Хуже проблемы - неэффективная поддержка асинхронного режима и редкие выпуски, что означает, что на исправление ошибок уходит несколько месяцев, если не лет.
Лучшим вариантом, который решит вашу текущую проблему, является использование пакета MySqlConnectorMySqlConnector . Он не зависит от пакетов совместимости в .NET Core (на самом деле, у него нет зависимостей, точка).
Сверх того:
- это настоящий проект OSS, созданный сообществом, такой же популярный, как и собственный драйвер Oracle (24 миллиона загрузок против 29 миллионов загрузок),
- это быстрее с истинными асинхронными методами
- Он используется самым популярным поставщиком Entity Framework, - 15 Pomelo.EntityFrameworkCore.MySqlмиллионов загрузок для 3M загрузок Oracle.
- Оба пакета активно поддерживаются и уже выпустили предварительные версии для EF Core 6 и .NET Core 6.
- Стоит повторить - никаких зависимостей от .NET Core / .NET 5/6.
Вам нужно использовать
/p:SelfContained=True /p:PublishProtocol=FileSystem
на месте
/p:PublishSingleFile=true