Не удается прочитать раздел пользовательской конфигурации после использования ILMerge

Тема: Я создаю консольное приложение (парсер документов) и использую NLog для регистрации событий обработки. После сборки я использую инструмент ILMerge для объединения всех DLL в один исполняемый файл (это необходимо для более удобного использования инструмента результатов)

Если я использую внешний xml-файл NLog.config для конфигурации логгеров - он работает хорошо (до и после объединения всех dll-ов и exe-файлов в один файл)

Итак, проблема: Но если я пытаюсь использовать раздел "nlog" в файле docsloader.exe.config - он работает только без слияния по IL (если все dll и exe файлы в отдельном режиме). Если я сначала объединяю результат в один файл и запускаю docsloader.exe, я вижу:

Unhandled Exception: System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration section handler for nlog: Could not load file or
 assembly 'NLog' or one of its dependencies. The system cannot find the file specified. (C:\d\projects\_\out\docsloader.exe.Config line 5)
---> System.IO.FileNotFoundException: Could not load file or assembly 'NLog' or one of its dependencies. The system cannot find the file specified.

docsloader.exe.config (первые 20 строк)

<configSections>
      <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
</configSections>  

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
  <targets>
        <target name="console" type="Console" layout="${date:format=HH\:mm\:ss}|${level}| ${message}" />
        <target name="file"  type="File" fileName="${basedir}/docsloader.log" layout="${date}|${level}| ${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Debug" writeTo="console" />
        <logger name="*" minlevel="Trace" writeTo="file" />
    </rules>
  </nlog>

<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/>
</startup>

....

ILMerge command:

C:\d\projects\_\ILMerge\ILMerge.exe /out:"C:\d\projects\_\_\out\docsloader.exe" "C:\d\projects\_\_\bin\Release\docsloader.exe" "C:\d\projects\_\_\bin\Release\*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /lib:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" /wildcards

echo Coping docsloader.exe.config...
cp C:\d\projects\_\_\bin\Release\docsloader.exe.config C:\d\projects\_\_\out\docsloader.exe.config

PS: Если я уберу -section и создам NLog.config - он будет работать корректно. Спасибо!


person Alexander Krylov    schedule 04.12.2015    source источник


Ответы (1)


Ошибка возникает из-за ссылки на тип NLog.Config.ConfigSectionHandler, NLog, которая ссылается на NLog dll (после запятой), которая больше не существует, поскольку теперь она объединена.

Вы можете заменить его на NLog.Config.ConfigSectionHandler, docsloader, и это, вероятно, сработает.

person Gluck    schedule 04.12.2015
comment
Отлично, спасибо! PS: Моя ошибка заключалась в том, что я пытался использовать имя проекта после запятой (вместо NLog), но это было неправильно, потому что скрипт сборки в VS задавал другое имя для выходного .exe-файла (ontoloader). Ваш ответ работоспособен. - person Alexander Krylov; 04.12.2015