.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

Другие вопросы по тегам