Введение
В этом посте показано, как заменить все .exe + .dll files
на один combined .exe
. Он также сохраняет файл отладки .pdb
без изменений.
Для консольных приложений
Вот базовый Post Build String
для Visual Studio 2010 SP1 с использованием .NET 4.0. Я создаю консоль .exe со всеми вложенными .dll файлами, включенными в него.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
Основные подсказки
- Выводом является файл "
AssemblyName.all.exe
", который объединяет все вложенные файлы в один .exe.
- Обратите внимание на каталог
ILMerge\
. Вам нужно либо скопировать утилиту ILMerge в каталог решений (чтобы вы могли распространять исходный код, не беспокоясь о документировании установки ILMerge), либо изменить этот путь, указав, где находится ILMerge.exe.
Дополнительные подсказки
Если у вас проблемы с тем, что он не работает, включите Output
и выберите Show output from: Build
. Проверьте точную команду, сгенерированную Visual Studio, и проверьте на наличие ошибок.
Пример сценария сборки
Этот скрипт заменяет все .exe + .dll files
на один combined .exe
. Он также сохраняет файл отладки .pdb без изменений.
Чтобы использовать, вставьте это в ваш шаг Post Build
, на вкладке Build Events
в проекте C #, и убедитесь, что вы изменили путь в первой строке, чтобы указать ILMerge.exe
:
rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0