2009-03-29 3 views
3

한 어셈블리를 다른 어셈블리에 번들하는 가장 좋은 방법은 무엇입니까? 배포 할 어셈블리가 있지만 사용하는 타사 어셈블리가 두 개 이상 있으며 둘 이상을 배포하지 않아도됩니다.기본 어셈블리와 함께 번들로 포함 된 임베디드 어셈블리를로드하는 방법은 무엇입니까?

그래서 몇 가지 어셈블리를 하나의 어셈블리로 컴파일하여 배포하고 싶습니다.

가장 좋은 방법은 무엇입니까? 내 프로젝트에 다른 어셈블리를 넣고 "임베디드 리소스"로 설정할 수는 있지만 어떻게 다시 가져올 수 있습니까? 즉 임베디드 어셈블리에 정의 된 클래스를 인스턴스화 할 수있는 곳으로 어떻게 가져 가나 요?

Assembly.Load 메서드를 본 적이 있지만 파일 경로가 필요합니다. 임베디드 어셈블리를로드하는 또 다른 방법이 있습니까? 어셈블리가있는 Load 메서드를 어떻게 말합니까?

일단 임베디드 어셈블리를로드하면 범위가 마술처럼 바뀌며 클래스를 자유롭게 인스턴스화 할 수 있습니까?

답변

5

메모리 배열에서 어셈블리를로드하는 데 사용할 수있는 과부하가 Assembly.Load(byte[])입니다. 내가 정확히 기억한다면, 그게 예를 들어 LINQPad의 작동 방식입니다. 여기 할 수있는 방법이있어, System.Reflection.Assembly의 인스턴스 인 관리 자원으로서 다른 어셈블리를 포함하는 소정 조립체

Stream embedded = assembly.GetManifestResourceStream ("asm.dll"); 
byte [] buffer = new byte [embedded.Length]; 
using (embedded) { 
    int length = buffer.Length; 
    int offset = 0; 
    while (length > 0) { 
     int read = assemblyStream.Read (buffer, offset, length); 
     if (read == 0) 
      break; 

     length -= read; 
     offset += read; 
    } 
} 

Assembly assembly = Assembly.Load (buffer); 
이 하나의 문제는 런타임이 바이트 배열을 고정 할 필요가 있다는 것이다

때문에 어셈블리를 임시 파일에 작성하고 Assembly.LoadFile을 사용하는 것이 좋습니다.

두 메서드 모두 System.Reflection.Assembly 개체를 반환하므로 형식을 가져온 다음 원하는 형식으로 원하는대로 수행 할 수 있습니다.

+0

실제로 수업을들을 때이 단계를 넘어서는 단계는 무엇입니까? 어셈블리를로드하고 Assembly 객체가 있으면 전역 클래스에 정의 된 모든 클래스가 있습니까? – Deane

+0

어셈블리가 현재 AppDomain에로드됩니다. 그런 다음 Assembly.GetType()을 사용하여 형식을 가져오고 Activator.CreateInstance를 사용하여 형식을 인스턴스화 할 수 있습니다. 어셈블리가 동적으로로드되기 때문에 유형을 동적으로 인스턴스화해야합니다. –

5

리소스에서 원래 어셈블리를로드하는 대신 참조를 수정하여 모든 어셈블리를 단일 어셈블리로 결합하는 ILMerge 유틸리티를 사용하는 것이 좋습니다.

관련 문제