Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 13.04.2015, 19:06   #1
 Пехотинец
Аватар для zZkamedosZz
 
zZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе ценуzZkamedosZz знает себе цену
Регистрация: 17.01.2014
Сообщений: 67
Популярность: 4064
Сказал(а) спасибо: 145
Поблагодарили 138 раз(а) в 101 сообщениях
Отправить сообщение для zZkamedosZz с помощью Skype™
 
По умолчанию Мини-гайд, Как собрать проект в Visual Studio в один файл с помощью ILMerge

Добрый вечер, всем)
Минут 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 без длл, он спокойно запускается и полностью работоспособен.

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

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

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

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

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

Надеюсь, что кому-то данная статья помогла.​
  Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
крайслер (03.08.2016), малина (15.04.2015)
Старый 30.05.2016, 23:14   #2
 Разведчик
Аватар для Pupsiks
 
Pupsiks излучает ауруPupsiks излучает ауруPupsiks излучает ауруPupsiks излучает ауруPupsiks излучает ауруPupsiks излучает ауру
Регистрация: 02.04.2012
Сообщений: 5
Популярность: 584
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Мини-гайд, Как собрать проект в Visual Studio в один файл с помощью ILMerge

После компиляции файл не запускается на других машинах...
  Ответить с цитированием
Старый 02.07.2016, 16:36   #3
Читер-спонсор
 Рыцарь-защитник
Аватар для Nickitee
 
Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(Nickitee сломал счётчик популярности :(
Регистрация: 28.08.2009
Сообщений: 603
Популярность: 19129
Золото Zhyk.Ru: 500
Сказал(а) спасибо: 84
Поблагодарили 602 раз(а) в 321 сообщениях
 
По умолчанию Re: Мини-гайд, Как собрать проект в Visual Studio в один файл с помощью ILMerge

Цитата:
Сообщение от PupsiksПосмотреть сообщение
После компиляции файл не запускается на других машинах...

ILMerge игнорит неймспейсы (namespace's) одинаковых либ. По ссылке на хабрахабр там это трабла намбер ван. Лучше всего использовать свой кастомный лоадер через AssemblyResolve.
add:
Ну тогда бы сборка с битой рефлексией не запускалась нигде, если запускается только на одной машине, значит у этой машины что-то есть, наличие com компонентов возможно, либо наличие wrapper-ов но отсутствие самой либы для которой писался wrapper.
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.

Последний раз редактировалось Nickitee; 02.07.2016 в 16:38.
  Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 15:25.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net