2009-10-19 3 views
3

파일을 잠그지 않고 어셈블리를로드하려고합니다. 이러한 어셈블리는 타사 어셈블리 일 수 있으므로 코드에 액세스 할 필요는 없으며 어셈블리 중 하나 또는 두 개가 Assembly.Location을 사용하여 해당 디렉터리에서 파일을 읽을 수 있습니다.Assembly.Load (Byte []) 및 Assembly.Location/Assembly.Codebase

섀도 복사본을 통해이 작업을 수행 할 수 있다는 것을 알고 있지만 제대로 작동하려면 문제가 있으며 특정 포럼의 여러 사용자가 어셈블리를 바이트 배열에로드하고 Assembly.Load (Byte [) 과부하. Assembly.Location에서 빈 문자열을 반환하고 Assembly.Codebase가 어셈블리를로드하는 응용 프로그램의 위치를 ​​반환하기 때문에 이러한 어셈블리 중 하나가 상위 디렉터리의 파일에 액세스하려고 시도 할 때까지이 방법이 유용합니다.

어떻게 든로드 할 어셈블리의 코드베이스 또는 위치 속성을 설정할 수 있습니까? 코드베이스와 위치에 대한 MSDN 문서에서 오버라이드 가능한 속성으로 정의되었습니다. 즉, 호스팅 응용 프로그램에서 오버라이드 할 수 있습니까?

+1

아마도 그림자 대처법이 가장 좋은 해결책이 될 것입니다 ... – Restuta

+0

@ Restuta, 나는 동의합니다. –

답변

1

AppDomainSetup.ApplicationBase을 사용할 수 있습니까? 또는로드하는 모든 어셈블리에 대해 해당 경로를 정의해야합니까?

편집 : 파일 이름을 사용하여이 코드베이스를 정의하기 쉽습니다 :

AssemblyName assemblyRef = new AssemblyName(); 
assemblyRef.CodeBase = assemblyFile; 
Assembly assembly = Assembly.Load(assemblyRef); 

은 어쩌면 당신은 AppDomain.AssemblyLoad 또는 Assembly.ModuleResolve 이벤트를 사용할 수 있습니다, 그러나 나는 의심한다.

+0

로드 된 각 어셈블리는 다른 경로에서로드되므로 각각 다른 위치 또는 코드베이스 속성이 필요합니다. –

+0

문제는 파일 이름을 사용하면 어셈블리 dll을 잠그고 파일 시스템에 의해 삭제 (또는 더 중요하게는 덮어 쓰기)되는 것을 막을 수 있다는 것입니다. –

+0

이 기사는 CodeProject에서 작성한 것입니다 : http://www.codeproject.com/KB/WCF/generic_wcf_host.aspx; 그 Console Hoster는 어셈블리를 잠그지 않습니다. –

0

사용 ::

var assembly = Assembly.ReflectionOnlyLoad(System.IO.File.ReadAllBytes(yourFullfileNamePath));

그러나 당신은 여전히 ​​다른 응용 프로그램 도메인에서이 작업을 수행해야합니다.