@druoleg
DevOps'твующий

Почему не работает консольное приложение в Mono?

Пытаемся запустить простое консольное приложение, которое использует для своей работы Log4Net (12.10).
Используется AltLinux 6.0.1 и Mono 2.6.7, .Net Framework 3.5.
Вот результат нормального "выхлопа" в Windows:
F:\Work\Projects\Mono\Debug>Tool.exe

Список возможных аргументов:
Tool.exe [-CheckDB] [-CheckFreeSpace] [-BackupDB] [-ShrinkDB]
-CheckDB Проверка БД
-CheckFreeSpace Проверка наличия свободного места на жестком диске
-BackupDB Резервное копирование БД
-BackupAttachments Резервное копирование прикрепленных файлов
-RemoveOldBackups Удаление старых резервных копий
-RestoreLogConfig Восстановление конфигурационного файла логгирования
-ShrinkDB Очистка неиспользуемых данных


При запуске через mono сразу спотыкаемся на ошибке:
[root@host-198]# sudo mono Tool.exe

Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for Tool ---> Common.Logging.ConfigurationException: Unable to create type 'Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net' ---> System.TypeLoadException: Could not load type 'Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net'.
at (wrapper managed-to-native) System.Type:internal_from_name (string,bool,bool)
at System.Type.GetType (System.String typeName, Boolean throwOnError, Boolean ignoreCase) [0x00000] in :0
at Common.Logging.ConfigurationSectionHandler.ReadConfiguration (System.Xml.XmlNode section) [0x00000] in :0
--- End of inner exception stack trace ---
at Common.Logging.ConfigurationSectionHandler.ReadConfiguration (System.Xml.XmlNode section) [0x00000] in :0
at Common.Logging.ConfigurationSectionHandler.Create (Common.Logging.Configuration.LogSetting parent, System.Object configContext, System.Xml.XmlNode section) [0x00000] in :0
at Common.Logging.ConfigurationSectionHandler.System.Configuration.IConfigurationSectionHandler.Create (System.Object parent, System.Object configContext, System.Xml.XmlNode section) [0x00000] in :0
at System.Configuration.ConfigurationSection.GetRuntimeObject () [0x00000] in :0
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000] in :0
at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000] in :0
at Common.Logging.Configuration.DefaultConfigurationReader.GetSection (System.String sectionName) [0x00000] in :0
at Common.Logging.LogManager+<>c__DisplayClass3.b__0 () [0x00000] in :0
at Common.Logging.Configuration.ArgUtils+<>c__DisplayClass13.b__12 () [0x00000] in :0
at Common.Logging.Configuration.ArgUtils.Guard[Int32] (Common.Logging.Configuration.Function`1 function, System.String messageFormat, System.Object[] args) [0x00000] in :0
--- End of inner exception stack trace ---

Как я понимаю - не удается распарсить XML, а именно путь к файлу с конфигурацией log4net:
<?xml version="1.0" encoding="utf-8" ?>

...


Сам файл расположен в той же папке что и EXE.

Если мы отключаем log4net, то запуск приложения проходит без каких либо действий:
[root@host-198 Tool]# sudo mono --debug Tool.exe
[root@host-198 Tool]#

Если мы передаем нужный парамтер, то получаем ошибку:
[root@host-198]# sudo mono --debug Tool.exe -CheckFreeSpace
??????: An exception was thrown by the type initializer for Tool.Factory

В коде есть вилка:
if (!(ConfigurationManager.GetSection("Config") is Config))
{
throw new ConfigurationErrorsException(Resource.ErrorConfiguration + Resource.ErrorConfigSectionIsWrongOrEmpty);
}
Config = (Config)ConfigurationManager.GetSection("Config");

Которая указывает на кривой конфиг, но мы его проглядели вдоль и поперек - даже если строки подключения к БД кривые, он должен стартовать - схема конфига не нарушена.

Прошу помочь советом.
  • Вопрос задан
  • 497 просмотров
Решения вопроса 1
@druoleg Автор вопроса
DevOps'твующий
Проблема решена ковырянием исходного кода Mono и утилиты.
Программа запустилась после устранения двух ошибок (на Mono 4.3.0):
1. не правильно подключалась одна из библиотек;
2. в конфиге была опечатка с регистром;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы