2014-11-04 10 views
0

동일한 어셈블리를 사용해야하는 몇 가지 응용 프로그램이 있습니다. 이 어셈블리는 정기적으로 바뀔 수 있으며 다른 MSIs으로 설치할 수 있습니다. 이런 이유로, 나는 그것을 GAC에 넣고 싶지 않습니다, 그것은 시간이 지남에 따라 배포 악몽이 될 수 있습니다. 나는 내가 runtime 어디 어셈블리를 찾을에게 어떻게 응용 프로그램에서 NO이 어셈블리에 대한 CopyLocal 속성을 설정하면GAC가 아닌 다른 위치에서 어셈블리로드

?

예. 응용 프로그램이 C:/Program Files/<some directory>/bin DLL에로드는

가이 방법으로 assembly를로드하는 것이 가능하다 C:/<some other directory>에?

<codebase>을 살펴 보았지만 어셈블리에 강력하게 서명 할 수 있는지 잘 모르겠습니다. 그리고 probing은 응용 프로그램의 하위 디렉토리로 지정된 개인 경로에서만 작동하는 것 같습니다.

알려 주시기 바랍니다. 고맙습니다.

+0

'AppDomain.CurrentDomain.AssemblyResolve' 이벤트를 사용해 보셨습니까? –

+0

모든 응용 프로그램에서 dll의 동일한 복사본을 사용해야하는 이유는 무엇입니까? 자체 복사본을 사용하는 각 응용 프로그램의 문제점은 무엇입니까? –

+0

중복을 피하고 올바른 버전의 어셈블리가 있는지 확인해야합니다. – user1173240

답변

1

Assembly.LoadFrom을 사용하여 어셈블리를 메모리에로드 한 다음 Activator.CreateInstance를 사용하여 원하는 형식의 인스턴스를 만들 수 있습니다. 이를 위해 사용자 리플렉션이 필요합니다.

Assembly assembly = Assembly.LoadFrom("c:\\path\\MyDll.dll"); 

Type type = assembly.GetType("MyClass"); 

object instanceOfMyType = Activator.CreateInstance(type); 

매개 변수가있는 인스턴스를 만들려면 반사를보십시오.

2

CopyLocal을 "아니오"로 설정 하시겠습니까? "DLL hell"(일명 "배포 악몽")을 피하는 일반적인 방법은 DLL 종속성이 프로그램과 동일한 디렉토리에 복사되는지 확인하는 것입니다. IMHO, 이것은 당신이 원하는 DLL을로드하는 것을 보장하는 가장 단순하고 가장 직접적인 방법입니다.

DLL에 서명하고 GAC에 설치 한 다음 자신의 프로그램에 "DLL 지옥"주소도 지정해야하는 특정 버전 (또는 필요에 따라 최소 버전)이 필요합니다. 시나리오. 나는. 특정 버전이 필요하고 .NET이 올바른 버전과 틀린 버전을 확실하게 구분할 수 있기 때문에 다른 버전의 DLL이 존재하지 않아도 충돌하지 않습니다.

이러한 접근법을 제외하면 ...

귀하의 정확한 요구 사항이 명확하지 않습니다. 그러나 일반적인 어셈블리로드 경로에없는 어셈블리를 식별하는 방법을 제공하려는 경우 사용할 수있는 메커니즘이 적어도 두 가지 있습니다.

한 가지 방법은 ApplicationBasePrivateBinPath을 사용하여 .NET에서 어셈블리를 검색하는 방법을 제어하는 ​​것입니다.

또 다른 방법은 System.AppDomain.AssemblyResolve 이벤트를 처리하는 것입니다.

.NET은 참조 된 어셈블리를로드하려고 시도 할 때마다 발생하며 찾을 수 없습니다. 그런 다음 처리기는 필요한 검색을 수행하거나 해당 문제에 대해 고정 경로를 사용하고 어셈블리 자체를로드 (예 : Assembly.LoadFrom() 사용) 한 다음 이벤트의 arguments 객체를 통해 반환합니다.

.NET이로드 할 DLL을 찾을 수없는 경우에만 AssemblyResolve 이벤트가 발생합니다.따라서 DLL의 프로그램에 대한 참조 요구 사항을 충족시키는 DLL의 다른 인스턴스를 가질 수 없다면 적절한 해결책이 아닙니다.

+0

버그 수정에 따라 어셈블리가 자주 변경 될 수 있습니다. 또한 어셈블리를 사용하는 다른 응용 프로그램이 업데이트 된 어셈블리를 설치하는 패키지와 함께 업데이트되지 않을 수도 있습니다. 이전 설치 제거 프로그램이 GAC에서 이전 설치 제거 프로그램을 제거하지 못했고 새 설치 프로그램이 다른 버전의 어셈블리를 설치 한 경우 이전 버전에 액세스하고 새로운 버전에 액세스하는 상황이 발생합니다. 이러한 시나리오가 여러 개있을 수 있습니다. 그리고 이것이 제가 GAC에별로 호의적이지 않은 이유입니다. – user1173240

+0

GAC는 다른 버전의 어셈블리를 처리 할 수 ​​있습니다. 어쨌든, 당신이 의존하는 DLL을 프로그램 EXE와 같은 디렉토리에 복사하는 것이 왜 유용하거나 바람직한 솔루션이 아닌 이유는 분명합니다. –