.NET에서 GAC에있는 어셈블리의 로컬 복사본을 사용하도록 강제하는 방법
내가 통제 할 수없는 이유로 GAC에 있어야 하는 .NET 어셈블리가 있습니다. 그러나 동일한 어셈블리의 이전 버전의 자체 복사본이있는 다른 프로그램에서 동일한 어셈블리를 사용합니다. GAC에있는 것이 아닌 자체 복사본을 사용해야합니다. 적절한 버전 관리는이 경우에 가치가있는 것보다 더 번거로울 것입니다. 내 질문은 : 어쨌든 .NET에게 말할 수 있습니까?이 디렉토리에서 바로 여기이 DLL을 사용하십시오-GAC 또는 다른 곳에서 찾은 것은 무시하십시오 .
GAC 어셈블리와 로컬 어셈블리의 버전 번호가 서로 다른지 확인합니다 (AssemblyInfo : [assembly : AssemblyVersion ( "1.0.0. *")에서 AssemblyVersion을 와일드 카드로 지정하여 빌드 번호가 자동 증가되도록하는 것은 좋지 않습니다. )]). 그런 다음 앱의 구성을 사용하여 어셈블리 바인딩을 리디렉션합니다.
- http://msdn.microsoft.com/en-us/library/2fc472t2(VS.80).aspx
- http://msdn.microsoft.com/en-us/library/433ysdt1(VS.80).aspx.
귀하의 경우에는 assemblyBinding 구성의 "appliesTo"특성이 필요하지 않습니다. 다음과 같은 것이 필요합니다.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="YourAssembly" publicKeyToken="AAAAAAAAAAAA" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.0.8.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
버전 번호가 같으면 할 수 없습니다. GAC 어셈블리와 동일한 전체 어셈블리 이름 (이름, 버전, 키)을 가진 어셈블리를로드하려고하면 CLR은 매번 GAC 어셈블리를 선택합니다.
어셈블리를 강제로로드하도록 DEVPATH를 설정할 수 있습니다. 링크 텍스트를 참조하십시오.
이것은 개발 용도로만 사용되며 프로덕션 사용을 반영하지 않기 때문에 실제로 권장되지 않기 때문에 귀하의 질문에 대답하지 않습니다. 하지만 알기 때문에 어차피 공유하겠다고 생각했습니다.
Assembly.LoadFromFile ()을 사용해 보셨습니까? 이것은 수동으로 수행하는 작업이지만 필요하기 전에 어셈블리를 메모리에로드해야합니다. 그런 다음 .NET은 사냥하는 대신 메모리에서 하나를 사용합니다.
또 다른 방법은 로컬 어셈블리가 서명되지 않은 경우 그렇게 구별 할 수있는 것입니다.
Rob
비슷한 문제가있었습니다. 새 dll을 사용 ildasm
하고 ilasm
생성 하여 대상 dll의 publicKeyToken을 변경했습니다 . 그런 다음 프로젝트 참조에서 새 dll을 가리 키도록 업데이트했습니다. 내가 취한 단계는 여기에 있습니다 .
이것은 나를 위해 일했습니다.
바인딩 리디렉션이 작동하지 않는 한 가지 이유는 Oracle.ManagedDataAccess 공급자가 관리되지 않는 공급자와 다른 dll 검색 순서를 가지고 있기 때문입니다. 관리되지 않는 공급자는 응용 프로그램 디렉터리에서 시작한 다음 레지스트리의 dllpath, machine.config의 dll 경로, web.config의 dll 경로를 차례로 찾습니다. Oracle 설명서에 따르면 관리 공급자의 검색 순서는 다음과 같이 작동합니다.
관리되는 드라이버는 다음 검색 순서를 사용하여 이러한 어셈블리를 참조합니다.
- 전역 어셈블리 캐시
- 웹 응용 프로그램의 bin 디렉터리 또는 Windows 응용 프로그램의 EXE 디렉터리
- 응용 프로그램이 32 비트 또는 64 비트 .NET Framework에서 실행되는지 여부에 따라 x86 또는 x64 하위 디렉터리입니다. 애플리케이션이 AnyCPU를 사용하여 빌드 된 경우 ODP.NET은 어셈블리를 사용할 수있는 한 올바른 DLL 비트를 사용합니다. Oracle은 애플리케이션이 AnyCPU 인 경우이 방법을 사용하여 종속 어셈블리를 찾을 것을 권장합니다.
따라서이 문제를 해결하는 방법은 GAC 어셈블리의 등록을 취소하거나 제거 할 수없는 경우 GAC에있는 것과 다른 버전의 Oracle.ManagedDataAccess를 bin 및 web.config에 넣는 것입니다.
'Program Tip' 카테고리의 다른 글
! = 연산자가 OpenMP에서 허용되지 않는 이유는 무엇입니까? (0) | 2020.11.05 |
---|---|
PHP 7 인터페이스, 반환 유형 힌트 및 자체 (0) | 2020.11.05 |
모나드 대 화살 (0) | 2020.11.05 |
Asp.Net 웹 양식 및 Asp.Net 웹 페이지 (0) | 2020.11.05 |
Flutter를 사용하여 어떻게 로컬 저장소에 저장할 수 있습니까? (0) | 2020.11.04 |