2010-05-06 3 views
5

У меня есть решение в Visual Studio с 5 проектами. К ним относятся:Ссылка на сборки, созданные с помощью ILMerge в проектах Visual Studio

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

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

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

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

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

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

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

ответ

2

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

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

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

+0

Да, я пробовал это сделать, но не смог получить эффект, который я искал. Похоже, что ILMerge нужно зарезервировать для последнего шага перед выпуском, а не для компиляции. –

+0

Я думаю, вы можете достичь этого, если ваши проекты строятся в правильном порядке. Установили ли вы зависимости проекта, чтобы обеспечить порядок сборки? – JoeBilly

3

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

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

  1. Построено решение.
  2. Запускает ILMerge на ваших первичных узлах с выходом, являющимся файлом в условной ссылке.
  3. Восстановите решение, но на этот раз, поскольку объединенная сборка существует, сборка без соединения или спутника теперь будет иметь правильную ссылку.
+0

Вот пример приведенной выше концепции. не забудьте посмотреть теги ProjectReference и Reference: https://github.com/joliver/EventStore/blob/5fce28b92fa875ea8acdfea387161abdee3c8b00/src/proj/EventStore.Persistence.RavenPersistence/EventStore.Persistence.RavenPersistence.csproj –