Ссылки на сборки, созданные с помощью ILMerge, в проектах Visual Studio

У меня есть решение в Visual Studio с 5 проектами. Они есть:

  • Foo.Core: основные функции
  • Foo.Api: созданный код на основе ядра
  • Foo.Web: веб-расширения.
  • Foo.Web.Mvc: расширения для MVC
  • Newtonsoft.Json: сторонняя библиотека

Я хочу использовать ILMerge для объединения Foo.Core, Foo.Api и Newtonsoft.Json в единую сборку, называемую Foo. Это легкая часть.

Проблема, с которой я столкнулся, заключается в том, что и Foo.Web, и Foo.Web.Mvc должны ссылаться на все три объединенные сборки.

Если я буду ссылаться на исходные сборки, они будут иметь недопустимые ссылки после выполнения ILMerge.

Если я ссылаюсь на сборку ILMerged, я должен ссылаться на отладочную сборку, а затем изменять ее, прежде чем я все упакую, что не кажется идеальным.

Я попытался создать проект под названием Foo, который ссылается на 3 объединенные сборки и заменяет собственный вывод сборкой ILmerged, но это, похоже, вообще не работает.

Есть ли надежный способ сделать это?


person Daniel Schaffer    schedule 06.05.2010    source источник


Ответы (2)


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

Во-первых, мы отредактировали файлы csproj всех неслитых или вспомогательных проектов, чтобы использовать условный ссылка на внешнюю сборку, основанная на существовании файла. В этом случае мы собираемся проверить наличие объединенной сборки. Затем мы запустили сценарий сборки, который выполняет следующие действия:

  1. Строит решение.
  2. Запускает ILMerge на ваших основных сборках с выходным файлом в условной ссылке.
  3. Перестройте решение, но на этот раз, поскольку объединенная сборка существует, не объединенные или вспомогательные сборки теперь будут иметь правильную ссылку.
person Jonathan Oliver    schedule 07.01.2011
comment
Вот пример вышеупомянутой концепции. не забудьте посмотреть на теги ProjectReference и Reference: github.com/joliver/EventStore/blob/ - person Jonathan Oliver; 07.01.2011

ILMerge предназначен для создания нового пакета / компонента как «продукта» в штучной упаковке (API, Программа ...), чтобы упростить управление сборкой, например развертывание, ссылку на gac, видимость сборки и многое другое, как для универсального использования, так и для внешнего использования. не смешанный.

Я предполагаю, что вам нужно настроить PostBuildEvent в своей основной сборке / проекте (Foo.Api?), Если у вас есть один или PreBuildEvent в ваших проектах Foo.Web и Foo.Web.Mvc, чтобы сгенерировать ваши объединенные Foo, которые будут упоминаться в ваших проектах Foo.Web и Foo.Web.Mvc как внешние сборка.

Вы можете сделать это более интегрированным в Visual Studio, настроив задачу MsBuild. образец (из Stackoverflow).

person JoeBilly    schedule 08.05.2010
comment
Да, я пробовал это сделать, но не смог добиться желаемого эффекта. Похоже, что ILMerge нужно будет зарезервировать для последнего шага перед выпуском, а не для времени компиляции. - person Daniel Schaffer; 09.05.2010
comment
Я думаю, вы сможете добиться этого, если ваши проекты будут построены в правильном порядке. Вы установили зависимости своего проекта, чтобы обеспечить порядок сборки? - person JoeBilly; 09.05.2010