2014-10-13 7 views
1

하나의 디렉토리에서 같은 이름의 다른 dll (다른 버전)을 어떻게 사용할 수 있습니까? 예를 들어 LibA (ExternalLib.dll)의 버전이 1이고 LibB (ExternalLib.dll)의 버전이 2입니다.C# 하나의 디렉토리에 다른 버전의 dll 사용

내 모든 프로그램을 동일한 디렉토리에 배포하고 있습니다. 이 사실을 바꾸십시오). 문제는 LibB를 사용하는 ProgramB가 ProgramA가 LibA를 사용하고 ProgrammA가 더 이상 작동하지 않는 디렉토리에 배포되는 경우입니다.

큰 변화가있는 경우 내 자신의 Libs에 대해 메이저 버전 번호 (.01, .02)를 사용합니다. 하지만 내가 사용하고있는 Lib은 외부 Lib이며 각 버전마다 다른 라이센스 키 (프로그램 자체에서 처리)가 필요합니다.

"ExternalLib.dll"에서 "ExternalLib.v1.dll"및 "ExternalLib.v2.dll"로 외부 라이브러리의 이름을 바꾸려고했지만 새로운 컴파일 된 프로그램을 실행할 때 "ExternalLib .dll을 찾을 수 없습니다. " 내 프로젝트의 참조가 "ExternalLib.v1.dll"로 설정되고 컴파일이 정상적으로 작동합니다.

같은 디렉토리에서 다른 어셈블리 버전을 처리하기위한 아이디어 나 제안이 있으십니까?

+0

강력한 타사 키로 서명해야하는 타사 DLL을 GAC에 넣어야합니다. http://msdn.microsoft.com/en-gb/library/yf1d93sz(v=vs.110).aspx –

답변

4

DLL 파일의 파일 이름은 .Net이 이러한 유형을로드하는 방법과 거의 관련이 없습니다. 실제 이름은 컴파일 프로세스의 일부로 어셈블리의 메타 데이터에 기록됩니다. 따라서 런타임에 파일의 이름을 바꾼 것과 관계없이 ExternalLib.dll을 조사합니다. 이 문제를 해결하는 일반적인 방법은 GAC에 설치하고 Strong Naming을 사용하여 특정 버전을 참조하는 것입니다.

  1. 당신을 위해 버전 특정 DLL의를 생산하는 업체에게 문의 :이 작업을 수행 할 수 없습니다 감안할 때

    , 당신이 시도 할 수있는 4 가지가있다. 버전 이름이 파일 이름의 일부이며 어셈블리 매니페스트에 포함되도록 컴파일 할 수 있습니다. 이것은 당신을위한 가장 간단한 해결책 일 것입니다.

  2. AssemblyResolve 이벤트를 처리하고 수동으로 시도하고 Assembly.Load를 사용하여 원하는 파일을 지정하여 사용할 dll을 구체적으로 지정할 수 있도록하십시오. 자세한 내용은 http://support.microsoft.com/kb/837908을 참조하십시오. 그러나 효과적으로 코드를로드 할 파일을 선택하려면 Assembly.LoadFrom(specific_path)을 사용하게됩니다.

  3. 가능하면 ildasm.exe을 사용하여 dll을 중간 언어 (IL)로 디 컴파일 한 다음 ilasm.exe을 사용하여 새 DLL 이름으로 다시 컴파일 할 수 있습니다. 그런 다음이 새 DLL 이름을 프로젝트에서 참조하게됩니다.

  4. 어셈블리가 서명되지 않은 경우 매니페스트를 직접 편집 할 수 있습니다. 호환 이진 편집기 나 MT.exe을 사용할 수 있습니다.