2009-07-15 3 views
4

나는 여기서 누락 된 단순한 것이 있기를 바라고 있습니다. 내가 할 수있는 느슨하게 몇 내 서비스가 더 큰 유연성을 얻을 수 있도록 두 개의 프로젝트두 개의 개별 프로젝트를 유지 관리 할 수 ​​있지만 하나의 DLL로 병합 할 수 있습니까?

ProjectName.Core & 
ProjectName.Infrastructure 

이 전형적인 양파 아키텍처에서 만든을 유지하기 위해 노력하고 있습니다. 인프라 프로젝트는 핵심 프로젝트를 참조합니다. 컴파일 된 후에는이 DLL을 생성합니다.

ProjectName.Core.dll & 
ProjectName.Infrastructure.dll 

그러나이 DLL은 단지 1 개의 DLL 만 생성하고 싶습니다.

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

나는이 작업을 수행 할 수 있지만,이 예외를 throw 인프라 참조 코어 이후이 핵심 DLL을 찾을 수 없기 때문에 ILMerge를 사용하는 것을 시도했다. 그것은 분명히 그 자체 내에서 보이지 않습니다. 나의 현재 솔루션을 사용하여 ILMerge에게 호출

지금 내가

ProjectName.Core & 
ProjectName.DataAccess & 
ProjectName.Web 

편집으로 함께 같은 결합 할 것이다 코어를 참조하는 다른 조합 및 다른 프로젝트를 가지고 있기 때문에 별도의 프로젝트를 관리 할 필요가 Nant 빌드 스크립트. 그것은 성공적으로 병합되었습니다. 하지만 병합 DLL을 사용하려고하면 코어 라이브러리를 찾을 수 없기 때문에 예외가 발생합니다.

<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> 

좀 더 명확해야합니다. 코어 라이브러리에서 개체를 사용할 수는 있지만 인프라 라이브러리에서는 사용할 수 없습니다. 한 번 그 개체 중 하나를 인스턴스화하려고 .NET. 종속성을로드하려고 시도하지만 찾을 수 없습니다.

+1

또는 두 개의 DLL을 제공하고 완료 할 수 있습니다. 그냥 ... –

+0

이 또한 사실입니다. 우리는 현재 모든 DLL을 제공하며 사용자를 위해 간단하게하려고합니다. –

답변

1

Visual Studio에서는 불가능하지만 모든 프로젝트를 netmodule로 컴파일 한 다음 DLL로 함께 결합 할 수 있습니다.

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

를 다음의 al.exe 도구와 함께 연결 .netmodule Files as Linker InputC# Assemblies를 참조하십시오 다음과 같이 컴파일합니다.

+0

예. 또한 Nant 빌드 스크립트의 일부로 모든 것을 지정할 수 있습니다.그러나 각 프로젝트의 스크립트와 MSBUILD 프로젝트 파일을 유지 관리하는 추가 작업은 피하고 싶습니다. –

4

ILMerge을 사용하십시오. 이 작업을 수행하는 즉시 사용할 수 있습니다.

0

ILMerge의 최신 버전은 병합 된 어셈블리의 전이 폐쇄에 작동하는 /closed 옵션이 있습니다. 이 정확한 문제를 해결합니다 (ILMerge.doc 사용자 설명서의 2.6 Closed4.1 Input assembly not merged in correctly 섹션 참조).

어셈블리에서 개체를 동적으로로드하려고 시도하면 병합 된 어셈블리 이름이 원래 어셈블리 이름과 다르기 때문에 라이브러리가 동적으로 개체를로드하려고 시도합니다. 이 경우에는 ILMerge가 할 수있는 일이 없습니다. 이 문제를 설명하기 위해 의존성 삽입을 수정해야합니다.

관련 문제