2014-11-03 7 views
4

저는 GAC를 처음 사용하기 때문에 사용해야 할 때와 사용하지 말아야 할 때를 대비하려고합니다. 여기에 내 상황이있다 :GAC를 언제 사용합니까?

나는 다른 상용 제품에 주로 추가 기능 소프트웨어를 개발하여 제품이 내 제품을 코드에로드하도록한다. 모든 응용 프로그램 (예 : 라이센스 모듈)에서 사용하는 여러 가지 어셈블리가 있습니다. 이러한 라이브러리의 .dll 파일은 기본 응용 프로그램 디렉터리에 설치되어 부모 프로그램이 해당 프로그램을로드합니다.

문제는 사용자가 내 소프트웨어 타이틀 두 개를 설치했을 때 부모 프로그램이 버전에 관계없이 찾은 어셈블리의 첫 번째 복사본 만로드하기 때문에 충돌이있을 수 있다는 것입니다. 따라서 License1.0.dll이 포함 된 Software A 버전 1.0과 License1.0.dll과 다른 메소드 및/또는 인수가있는 License 2.0이 포함 된 Software B 버전 2.5가있는 경우 1.0을로드 한 다음 예외를 throw합니다. 올바른 라이센스 방법을 찾을 수 없기 때문에 소프트웨어 B.

초기 연구에서 GAC가이 문제에 대한 답이되도록 의도 된 것 같았고 여러 사이트가 그렇다고 말하는 것 같았지만 this subject과 그 링크가 사용하지 않는 것으로 보이는 것 같습니다 이것에 대한 GAC.

나는 혼란 스럽다. GAC를 사용하여 조사해야하는 경우 누군가가 직접지도를 할 수 있습니까?

+1

GAC를 사용하면 더 많은 문제가 발생할 것입니다. 소비하는 응용 프로그램과 같은 소리는 구성 파일의 어셈블리 리디렉션을 통해 또는 컴파일 타임에 참조의 특정 경로를 설정하여 올바른 버전 DLL을 가리 키도록 구성해야합니다. 나는 그 대답이 무엇인지에 대해 확신하지는 않는다. – TyCobb

+0

불행히도 부모 응용 프로그램을 제어 할 수는 없지만 .NET 어셈블리를로드하는 단일 응용 프로그램의 표준 동작은 이해할 수 있습니다. I.E. 3 개의 개별 응용 프로그램을 실행하면 별개의 도메인에로드되어 문제가 발생하지 않지만 3 개의 응용 프로그램은 단일 응용 프로그램 (및 도메인) 아래에로드되므로 하나의 복사본 만로드합니다. 다시 나는 이것에 상당히 새롭기 때문에 나는 틀릴지도 모른다 그러나 나의 이해이다 ... – sfaust

+0

주인이 배치를 맡고있는 것처럼 보이면 글쎄, 그것은 당신이이 변화를 만들 때까지 달려 있지 않다. 민감한 문제는 누구나 손쉽게 라이센스를 시행 할 수 있도록하는 것입니다. 이 문제를 해결하기 위해 GAC로 쉽게 넘어갈 수 있습니다. 매우 간단합니다. 이름이 강력해야합니다. 아마도 설치 프로그램 작성을 고려해야합니다. –

답변

1

등록 된 dll에 의존하기 때문에 GAC를 전혀 사용하지 않는 것이 좋으며 종종 문제가 있습니다. 어쨌든 수동으로 원하는 어셈블리를로드 할 수 있습니다. 64 비트 또는 32 비트 중 하나 인 부모 응용 프로그램이 있고 해당 SQLite x64 또는 x86 dll을로드해야합니다. 참조 된 어셈블리에 로컬 복사본이 있습니다. 런타임을 참조를 해결하는 첫 번째 장소입니다. 어떤 것이 있으면 GAC를 검사합니다.

AppDomain.CurrentDomain.AssemblyResolve += ResoveAssembly; 


private static Assembly ResoveAssembly(object sender, ResolveEventArgs e) 
{ 
    string fullPath = Assembly.GetExecutingAssembly().Location; 
    string path = Path.GetDirectoryName(fullPath); 

    if (e.Name.StartsWith("System.Data.SQLite")) 
    { 
     return Assembly.LoadFrom(Path.Combine(path, Environment.Is64BitProcess 
                ? "x64\\System.Data.SQLite.DLL" 
                : "x86\\System.Data.SQLite.DLL"));} 
     return null; 
    } 
} 

이 경우 누군가가 내가 그 일을 해요 왜 궁금 : DLL은 내가로드 할 무엇을 말할 수있는 곳 AssemblyResolve 이벤트가 일어날 수 있도록이 등록되지 않은 지금까지 내가 새로운 SQLite는 NuGet을 알고 패키지가 지금이 문제를 처리합니다. 그러나 우리가 그것을 사용하고 싶을 때 사용할 수 없었습니다.

+0

어떤 경우에는 어셈블리 해결을 사용했습니다. 그러나이 경우에는 하나의 프로그램이 dll 파일의 버전 1.0을로드하고 다른 하나는 버전 2.0을로드해야하며 둘 다 상위 응용 프로그램 (동일한 도메인)에서 실행됩니다. 이것이 가능한가? – sfaust

+0

어셈블리 문제 해결을 시도한 적이 한번도 없었습니다. 부모 앱이 다른 버전을 사용하고있을 때 문제가 있다는 것을 알고 있습니다. 나는 확실히 모르겠지만 그것이 assmbly 바인딩 [여기]와 함께 작동한다면 시도 했습니까 (http://stackoverflow.com/questions/2460542/using-different-versions-of-the-same-assembly-in-the -same-folder)? – KCT

+0

흥미 롭지 만 구성을 어디에 넣으시겠습니까? 부모 응용 프로그램을 제어하지 않기 때문에 구성에 액세스 할 필요가 없습니다. 내 dll 파일에만 액세스 할 수 있습니다 ... – sfaust