2016-03-02 8 views
0

Я создал сборку с помощью инструмента ILMerge.Используйте сборку из библиотеки, созданной через ILMerge

Существует сборка (позволяет назвать ее A), которая является частью этой упакованной сборки, которая будет использоваться другой сборкой, которая не входит в комплект поставки (позвоните по телефону B).

Теперь я хочу создать проект, который ссылается как на упакованную сборку, так и на B. Теперь я хотел бы сделать это:

public void Foo() 
{ 
    var obj = new Bar(); // Bar is part of `A` 
    var someFactory = new Factory(); // is part of `B` 
    someFactory.DoSomething(obj); 
    // compiler error here, which says I need to reference the assembly which contains `Bar` 
} 

Я убедился, что сборка A, который был включен в пакет и одна ссылка на B одинаковы.

Что-то я здесь не вижу?

Обновление с более Context

У нас есть DataModel проект, который имеет множество зависимых проектов (я знаю, что это плохо, в первую очередь, но его наследие код :-(), поэтому я хотел бы объединить все эти узлы к одному для того, чтобы использовать эту модель данных сборки более легко в нескольких растворах.

ответ

0

B ссылки A, не все, что причудливо deaky слиты сборочный вы придумали. он может содержать все типы A, но не являетсяA - asse МБИ. MyMergedPackage.Bar не является A.Bar, даже если они используют то же самое имя типа вплоть до пространства имен.

Существует несколько возможных решений.

  • Во-первых и наиболее очевидно, можно просто объединить B, а также. В типичном сценарии ILMerge вы объединяете все сборок (включая основной исполняемый файл) в одну славную особенность, поэтому у вас нет этой проблемы. Я предполагаю, что у вас есть веские причины не делать этого.

  • Вы можете просто позвонить в свою объединенную сборку A, хотя это A плюс много больше. Если A имеет сильное имя, вам нужно указать то же имя (версия и все) для вашей объединенной сборки. Это будет держать B счастливым, чего может быть достаточно, но это не сработает, если вы начнете добавлять несколько сборок, которые хотят кусок целого (вы не можете просто скопировать A вокруг под разными именами, так как типы не будут распознаны как одни и те же).

  • Если ваша версия .NET достаточно недавняя, вы можете создать новую сборку A, которая содержит только type forward для Bar для вашей новой сборки. Это A просто будет заполнителем оригинала и будет распространяться только для того, чтобы сохранить B и отсортированные друзья счастливы. Если у вас много типов, это довольно неудобно, что вам нужна автоматическая помощь. Я не знаю об этом. Это также скорее поражает точку слияния в большинстве сценариев, так как в любом случае вы снова получите несколько сборок.

  • Во время компиляции просто используйте отдельные сборки. При развертывании замените их на объединенную сборку.Отсортируйте код в коде с помощью обработчика AppDomain.AssemblyResolve, чтобы установить фактическую загрузку типа во время выполнения (просто переадресовывайте все неизвестные вашей объединенной сборке). Это может потребовать некоторого тщательного вмешательства, чтобы гарантировать, что событие срабатывает до. Время выполнения должно искать любую из ссылочных сборок (статические конструкторы могут особенно испортить вам удовольствие здесь).

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

+0

Таким образом, я не могу использовать сборку в проекте, а затем объединить ее и ожидать, что она все еще сможет использовать ее таким же образом? ('A! = Merged.A') – derape

+0

@derape Точно. Каждый тип, на который делается ссылка, включает в себя сборку, в которой он содержится, поэтому, если вы создаете тип в другой сборке (независимо от того, как эта сборка стала, путем слияния или иным образом), вам решать эту задачу (путем переименования сборок или путем исправления решения во время выполнения или путем обновления ссылок - перекомпиляция «B» с объединенной сборкой в ​​качестве ссылки будет другим решением). –