2015-12-04 2 views
2

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

Если я использую внешний XML-файл NLog.config для конфигурации журналов - он работает хорошо (до и после слияние всех dll-s и 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:

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 - он работает правильно. Спасибо!

ответ

2

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

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

+0

Отлично, спасибо! PS: Моя ошибка была и что я пытался использовать название проекта после запятой (вместо NLog), но я был некорректен, потому что скрипт сборки в VS задал другое имя для выходного файла .exe-файла (ontoloader). Ваш ответ работоспособен. –