2008-08-22 8 views
21

내 응용 프로그램은 런타임에 특정 하위 폴더에서 어셈블리를 동적으로로드합니다. 이러한 어셈블리는 다른 어셈블리와의 종속성으로 컴파일됩니다. 런타임에서 응용 프로그램 디렉토리에서로드하려고 시도합니다. 하지만 모듈 디렉토리에 넣고 싶습니다.어셈블리 및 해당 종속성로드

dll이 별도의 하위 폴더에 있음을 런타임에 알리는 방법이 있습니까?

답변

18

하나의 좋은 방법은 응용 프로그램 도메인의 AssemblyResolve 이벤트에 대한 이벤트 처리기를 추가하는 것입니다.

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

그런 다음 이벤트 처리기 방법에 당신은 Assembly.Load, Assembly.LoadFrom이 우선 중 하나를 사용하여 메소드로부터 반환 해결하기 위해 시도 된 어셈블리를로드 할 수 있습니다.

편집 : 나는 특히 자신의 앱을 구조 조정없이 작동 할 것입니다 유일한 방법입니다 어셈블리에 대한 참조를 해결, 위의 기술을 사용하여 생각하여 추가 정보를 바탕으로

. CLR이 해결하지 못한 모든 어셈블리의 위치는 런타임시 코드에 의해 결정되고로드 될 수 있습니다 ... 플러그 형 아키텍처와 어셈블리 참조 무결성 모두 비슷한 상황에서이 코드를 사용했습니다 스캐닝 도구.

+3

이 기술의 좋은 예는 응용 프로그램 LINQPad입니다. 단일 exe로 제공되므로 모든 라이브러리가 임베디드 리소스로 포함됩니다. 코드에 대해서는 http://www.albahari.com/nutshell/ch16.aspx를 참조하고 통찰력을 얻으려면 http://www.linqpad.net/HowLINQPadWorks.aspx를 참조하십시오. – Pat

4

매니페스트 파일의 <probing> 요소를 사용하여 다른 디렉터리에서 해당 어셈블리 파일을 찾도록 런타임에 지시 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

예컨대 : 제가 최근에 사용했던

<configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="bin;bin2\subbin;bin3"/> 
    </assemblyBinding> 
</runtime> 
</configuration> 
1

응용 프로그램 구성 파일에있는 <codeBase> 요소를 사용할 수 있습니다. "Locating the Assembly through Codebases or Probing"에 대한 자세한 내용.

글쎄로드 된 어셈블리에는 응용 프로그램 구성 파일 인 이 없습니다.

글쎄 런타임에서 특정 폴더를 알고 있다면 Assembly.LoadFrom을 사용할 수 있습니다.

+0

첫 번째 링크는 "주제가 더 이상 존재하지 않음"을 제공합니다. NET 4.0을 지정하면 다음과 같이 표시됩니다. [https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx](https://msdn.microsoft.com/en) -us/library/15hyw9x3 % 28v = vs.100 % 29.aspx) – AnorZaken

관련 문제