2009-07-15 1 views
4

Я надеюсь, что здесь просто что-то простое, чего я здесь не хватает. Я пытаюсь сохранить два отдельных проектаКак я могу поддерживать два отдельных проекта, но объединить их в одну DLL?

ProjectName.Core & 
ProjectName.Infrastructure 

Это сделано в типичной архитектуре лук, так что я могу свободно пара свои услуги и получить большую гибкость. Проект «Инфраструктура» ссылается на основной проект. После компиляции они генерируют эти DLL

ProjectName.Core.dll & 
ProjectName.Infrastructure.dll 

Но я хотел бы, чтобы он генерировал только 1 dll.

ProjectName.Infrastructure.dll (or even ProjectName.dll) 

Я пытался использовать ILMerge, чтобы выполнить эту операцию, но так как ссылки Инфраструктура Ядро это бросает исключение, потому что он не может найти DLL Core. Очевидно, он не смотрит в себя.

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

ProjectName.Core & 
ProjectName.DataAccess & 
ProjectName.Web 

EDIT: Мое текущим решение окликает ILMerge с использованием сценарий сборки Nant. Он успешно объединился. Но когда я пытаюсь использовать объединенную DLL, он генерирует исключение, потому что он не может найти библиотеку Core.

<target name="merge.core"> 
    <property name="temp.dir" value="${build.dir}\Temp\"/> 
    <mkdir dir="${temp.dir}" if="${not directory::exists(temp.dir)}"/> 
    <property name="tools.dir" value="&quot;${directory::get-current-directory()}\Tools\&quot;"/> 
    <exec program="Tools\ILMerge\ILMerge.exe" workingdir="."> 
     <arg value="/t:Library"/> 
     <arg value="/ndebug"/>  
     <arg value="/out:&quot;${build.dir}\Temp\ProjectName.Infrastructure.dll&quot;"/> 
     <arg value="&quot;${build.dir}ProjectName.Core.dll&quot;"/> 
     <arg value="&quot;${build.dir}Xceed.Compression.dll&quot;"/> 
     <arg value="&quot;${build.dir}ProjectName.Infrastructure.dll&quot;"/> 
     <arg value="&quot;${build.dir}ProjectName.Infrastructure.XmlSerializers.dll&quot;"/> 
    </exec> 
    <delete file="${build.dir}ProjectName.Core.dll"/> 
    <delete file="${build.dir}Xceed.Compression.dll"/> 
    <delete file="${build.dir}ProjectName.Infrastructure.dll"/> 
    <delete file="${build.dir}ProjectName.Infrastructure.XmlSerializers.dll"/> 
    <move file="${build.dir}\Temp\ProjectName.Infrastructure.dll" tofile="${build.dir}ProjectName.Infrastructure.dll"/> 
    <delete dir="${temp.dir}" if="${directory::exists(temp.dir)}"/> 
    </target> 

Чтобы быть немного более понятным. Я могу использовать объекты из библиотеки Core, но не библиотеки Infrastructure. Поскольку, когда он пытается создать экземпляр одного из этих объектов, кажется, что .NET пытается загрузить зависимость, но не может ее найти.

+1

Или вы можете просто отправить две библиотеки DLL и сделать это. Просто говорю ... –

+0

Это также верно. Мы, безусловно, поставляем со всеми DLL сегодня, и я пытаюсь упростить его для пользователей. –

ответ

1

Как я знаю, это невозможно в Visual Studio, но вы можете скомпилировать каждый проект как сетевой модуль и объединить их вместе как DLL. Компиляция, как это:

csc misource1.cs misource2.cs misource3.cs /target:module 

, а затем связать вместе с al.exe инструментом, см .netmodule Files as Linker Input и C# Assemblies.

+0

Да. Я также могу указать все как часть моего скрипта сборки Nant.Но я хочу избежать дополнительной работы по поддержанию сценария и файлов проекта MSBUILD для каждого проекта. –

4

Использование ILMerge. Это делается из коробки, чтобы сделать это.

0

Самая последняя версия ILMerge имеет /closed вариант, который работает на транзитивного замыкания присоединяемых узлов. Он решает эту точную проблему (см. Разделы 2.6 Closed и 4.1 Input assembly not merged in correctly в руководстве пользователя ILMerge.doc).

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

Смежные вопросы