Как отладить в сборку ILMerged? - PullRequest
8 голосов
/ 17 июня 2010

Сводка

Я хочу изменить процесс сборки решения из 2 сборок, чтобы вызывался вызов ILMerge, и сборка приводила к одной сборке.Далее я хотел бы иметь возможность отладки в результирующей сборке.

Подготовка - простой пример

  1. Новое решение - ClassLibrary1
  2. Создать статическую функцию 'GetMessage' в Class1, которая возвращает строку "Hello world "
  3. Создайте новое консольное приложение, которое ссылается на ClassLibrary.
  4. Выведите GetMessage из main () через консоль.

Теперь у вас есть приложение на 2 сборкикоторый выводит «Hello World» на консоль.

Так что дальше ..?

Я хотел бы изменить процесс сборки приложения консоли, чтобы включить посткомпиляциюшаг, который использует ILMerge, чтобы объединить сборку ClassLibrary в сборку консоли

После этого шага я должен быть в состоянии:

  • Запустить консольное приложение напрямую без ClassLibrary1.dll присутствует
  • Запустите консольное приложение через F5 (или F11) в VS и получите возможность отладки в каждом из 2 проектов.

Ограниченный успех

Я прочитал этот блог и сумел добиться слиянияПосле этого я выполнил команду после сборки ...

"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName)

... и файл ILMerge.bat, который читал ...

CD %1
Copy %2.exe temp.exe
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll 
Del temp.exe
Del ClassLibrary1.*

Это работает довольно хорошо,и фактически производит exe-файл, который работает вне среды VS, как требуется.Однако, похоже, что он не производит символы (файл .pdb), которые VS может использовать для отладки в коде.

Я думаю, что это последняя часть головоломки.

Кто-нибудь знает, как я могу сделать эту работу?

FWIW Я работаю VS2010 на 64-разрядной машине Win7 x64.

Обновление: Почему я хочу это сделать?

Был задан вопрос: «Действительно ли мне нужен ILMerge во время сценария отладки?»

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

Некоторые из этих решений будут иметь общие зависимости от разных версий некоторых сборок.

Таким образом, Solution1 может состоять из Console1 и ClassLibrary1.dll (v1), а Solution2 может состоять из Console2 и Classlibrary1.dll (v2).

Вместо того, чтобы регистрировать все в GAC, я подумал, что смогу ILMerge ввести правильную версию зависимости в основную сборку решения, чтобы избежать коллизии.

Однако в настоящее время это делает невозможнымотладить решение, которое мне нужно сделать в сочетании с другими решениями, которые будут присутствовать.

Это звучит сложно?Это потому что это ..: D

Ответы [ 4 ]

4 голосов
/ 28 июня 2010

Извините, у вас проблемы. Я не выполнил ваши точные шаги, но создал консольное приложение A.exe, которое вызывало метод в dll, B.dll. Я собрал обе сборки в режиме отладки (чтобы у них были файлы PDB). Затем я объединил их так:

ilmerge /out:foo.exe A.exe B.dll

(На самом деле A и B находились в другом каталоге, поэтому моя командная строка была немного сложнее, но это не должно иметь значения.) После завершения ILMerge в текущем каталоге было два файла: foo.exe и foo .pdb. Затем я набрал:

devenv foo.exe

Это открыло Visual Studio, а затем я нажал «F10», чтобы запустить отладчик. Мне удалось перейти к методу Main в исполняемом файле, а затем использовать «F11» для перехода к методу, который изначально был в B.dll. Процесс отладки был таким же, как и в исходном решении Visual Studio с двумя сборками.

Если у вас все еще есть проблемы, пожалуйста, не стесняйтесь поместить все ваше решение в zip-файл и отправьте его мне (mbarnett at microsoft dot com), и я могу попробовать это из.

1 голос
/ 17 июня 2010

Я бы посоветовал вам только ILMerge выпускать сборки своих сборок.Я не представляю никакой выгоды, которую вы получите от слияния отладочных сборок.

0 голосов
/ 06 августа 2015

Я попытался сделать что-то подобное и обнаружил, что вам не следует ничего переименовывать , ни до, ни после слияния. Перемещение материала в отдельный каталог - это нормально. Если вы ничего не переименовываете, это работает.

0 голосов
/ 17 июня 2010

Я не думаю, что ILMerge может это сделать.OTOH smartassembly от red-gate (не бесплатно) может сделать это, по крайней мере, так сказано в features

И да, я согласен с Майком использовать только ILMerge для релизных версий.

...