PDA

Просмотр полной версии : [Статья] Мини-гайд, Как собрать проект в Visual Studio в один файл с помощью ILMerge


zZkamedosZz
13.04.2015, 18:06
Добрый вечер, всем)
Минут 20 назад, задался вопросом, как не таскать дллки за проектом в С#.
В общем-то, решение нашлось, и довольно простое.
Это компилить проект с ипользованием ILMerge.
ILMerge - программа от Microsoft Research.
Я думаю, многие сталкивались с тем, что ситуация такая, когда:
something.exe
one.dll
two.dll
А хотелось бы не таскать .dll, и просто распространять один .exe
Для этого нужно просто скачать и установить ILMerge.
В его папке создать merge_all.bat файл
с кодом из под Кода:
@ECHO OFF

rem # set .NET version and output folder name
set net="v4, C:\Windows\Microsoft.NET\Framework\v4.0.30319"
set output=Output

rem # process arguments
set ILMergeSolution=%1ILMerge\ILMerge.exe


rem # determine programm files of x86 for 32 and 64 Platform
IF EXIST "%PROGRAMFILES(x86)%" set prorgammFiles=%PROGRAMFILES(x86)%
IF NOT EXIST "%PROGRAMFILES(x86)%" set prorgammFiles=%PROGRAMFILES%

rem # if ILMerge.exe not in the $(SolutionDir)ILMerge\
rem # then try to use installed in prorgammFiles
IF EXIST %ILMergeSolution% set ILMerge="%ILMergeSolution%"
IF NOT EXIST %ILMergeSolution% set ILMerge=%prorgammFiles%\Microsoft\ILMerge\ILMerge. exe

set target_path=%2
set target_file=%~nx2
set target_dir=%~dp2
set ConfigurationName=%3

rem # set output path and result file path
set outdir=%target_dir%%output%
set result=%outdir%\%target_file%

rem # print info
@echo Start %ConfigurationName% Merging %target_file%.
@echo Target: %target_path%
@echo target_dir: %target_dir%
@echo Config: %ConfigurationName%

rem # recreate outdir
IF EXIST "%outdir%" rmdir /S /Q "%outdir%"
md "%outdir%"

rem # run merge cmd
@echo Merging: '"%ILMerge%" /wildcards /targetplatform:%net% /out:"%result%" %target_path% "%target_dir%*.dll"'
"%ILMerge%" /wildcards /targetplatform:%net% /out:"%result%" %target_path% "%target_dir%*.dll"

rem # if succeded
IF %ErrorLevel% EQU 0 (

rem # clear real output folder and put there result assembly
IF %ConfigurationName%==Release (

del %target_dir%*.*
del %target_dir%*.dll
del %target_dir%*.pdb
del %target_dir%*.xml
del %target_dir%*.*

copy %result% %target_dir%
rmdir /S /Q %outdir%
set result=%target_path%
@echo Result: %target_file% "-> %target_path%"
) ELSE (
@echo Result: %target_file% "-> %result%" )

set status=succeded
set errlvl=0
) ELSE (
set status=failed
set errlvl=1
)

@echo Merge %status%

Данную папку ILMerge с содержанием ILMerge.exe и merge_all.bat положить в папку с решением(проектом).
Запустить решение >>Свойства проекта >> События построения>>Коммандная строка события после построения
Либо для англоязычных версий Project->Properties->Build Events->Post-build event
Туда добавить строчку
"$(SolutionDir)\ILMerge\merge_all.bat" "$(SolutionDir)" "$(TargetPath)" $(ConfigurationName)

После скопилить. В папке Release появится папка Output в ней будет один .exe без длл, он спокойно запускается и полностью работоспособен.

Ссылка на ILMerge ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Ссылка на код merge_all.bat ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Ссылка на источник, что послужило мотиваций для написания небольшого гайда ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Немного пруфов
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

а было
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Надеюсь, что кому-то данная статья помогла.​

Pupsiks
30.05.2016, 22:14
После компиляции файл не запускается на других машинах...

Nickitee
02.07.2016, 15:36
После компиляции файл не запускается на других машинах...
ILMerge игнорит неймспейсы (namespace's) одинаковых либ. По ссылке на хабрахабр там это трабла намбер ван. Лучше всего использовать свой кастомный лоадер через AssemblyResolve.
add:
Ну тогда бы сборка с битой рефлексией не запускалась нигде, если запускается только на одной машине, значит у этой машины что-то есть, наличие com компонентов возможно, либо наличие wrapper-ов но отсутствие самой либы для которой писался wrapper.