2012-05-03 3 views
1

У меня есть решение, состоящее из нескольких проектов (все библиотеки классов). Предположим: A, B, C, D, E.ILmerge and Assembly References

A, B и C обеспечивают основные функциональные возможности и должны быть распределены вместе. D и E предоставляют некоторые адаптеры, которые не обязательно необходимы в любой ситуации.

Итак, я хочу, чтобы ILmerge A, B и C в одну сборку (названную ABC) перед распространением.

Проблема заключается в том, что когда проекты скомпилированы, D и E имеют ссылки на A, B и/или C, а не ABC. Поэтому, когда позже я пытаюсь ссылаться на ABC, D и E в каком-то другом проекте, я получаю ошибки компиляции, говорящие примерно так: «Аргумент экземпляра: невозможно преобразовать из« A.IBoo »в« A.IBoo ». В VS я также вижу, что сборочные подписи (имена) разные, конечно.

Есть ли хороший способ исправить это?

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

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

ответ

2

У меня возникла аналогичная проблема. Оказалось, что у меня есть типы, на которые ссылаются дважды. Однажды в объединенной сборке и один раз в отдельных проектах. Это было ужасно.

Вы можете удалить проекты и ссылаться только на комбинированную сборку, рассматривая ее как библиотеку, или проекты могут быть объединены в операции пост-сборки.

Другой возможностью является псевдоним глобального пространства имен (http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx) и ссылка на объединенную сборку. Недостатком является то, что вы всегда будете строить в адаптерах.

Не видя реальных проектов, вот что я буду делать: я бы отделил проекты ABC и поставил их в свое собственное решение. С событием post build я запускал ILMerge. Убедитесь, что это версия и сильное имя. Это избавит вас от головной боли по дороге.

Проекты D и E были бы в решении вместе со ссылкой на объединенную сборку ABC.

Снова, не видя кода и зависимостей, трудно сказать. Также это зависит от того, как часто происходят изменения. Если я вношу изменения в ABC, чтобы разместить DE, у которых два решения будут очень старыми.

+0

Спасибо, что представили несколько вариантов. У меня есть внутренние и внешние ссылки, как в вашем случае. Фактически, проект, о котором я говорю, таков: https://github.com/Kostassoid/Anodyne, build.cmd может «объяснить», что я делаю до сих пор. Разделение решения, вероятно, является лучшей идеей, но поскольку это молодой проект, я должен часто работать над каждой его частью. – Kostassoid