실행 전 검증 프로그램 집합 리셋
이 라이브러리(Npgsql)는 두 가지 주요 버전이 있는데 각각 2이다.x에서 4.x. 우리의 사례에서 갱신의 주요 장점을 증가시켰다.NET 핵심 지원을 통해 이 monorepo의 서비스 증가분을 이식할 수 있습니다.순수한 핵심.
우리의 의존 구조는 다음과 같다.
- Npgsql
- SharedBusinessLogic
- Web UI layer
- Some async services that generate reports
- An unrelated UI project that doesn't use Npgsql directly
일부 데이터베이스 조회에 장애가 발생했지만 전체적으로 업데이트가 순조롭게 진행되는 것 같아서 테스트는 로컬과 CI에서 통과되었다.그러나 지점을 통합하여 테스트 환경에 배치한 후에 프로젝트가 일부 노선에서 오류를 던지기 시작했습니다.
어떻게 된 거야?
업데이트된 종속성 맵:
- System.Runtime.CompilerServices.Unsafe
- System.Numerics.Vectors
- System.Memory
- System.Threading.Tasks.Extensions
- Npgsql
- SharedBusinessLogic
- Web UI layer
- Some async services that generate reports
- An unrelated UI project that doesn't use Npgsql directly
Npgsql 의존 항목은 현재 netstandard를 목표로 하고 있습니다. 이것은 우리가 그것을 인용할 수 있다는 것을 의미합니다.NET Core 및.NET Framework 에는 호환성 해커가 없습니다.그러나 이를 실현하기 위해 이전에 에서 인용한 의존항을 설치했다.NET runtime은 이제 NuGet 패키지를 통해 참조됩니다.관례에 따르면, 그 중 대다수는 의존항 목록에 접두사가 있다System.
.그러나 우리의 일부 다른 응용 프로그램 의존항은 이미 이
System.
프로그램 집합을 인용했지만 버전은 다르다.곤혹스러웠어우리가 어떻게 일을 하는지 이야기합시다.
안에 있다NET 핵심 프로젝트 프로그램 집합 귀속 리셋은 필요하지 않지만, 우리의 많은 프로젝트는 여전히 위에서 실행되고 있습니다.NET 4.8이라고도 합니다.NET 프레임워크 또는 netfx
실행 중.NET Framework는 요청된 종속 항목의 특정 버전을 해석하려고 시도합니다.만약 bin 폴더에 정확한 버전이 존재하지 않는다면, 프로그램 집합 귀속이'강제'로 실행될 때 특정 버전으로 해석되어야 합니다. 그렇지 않으면 이상이 발생합니다.이 귀속은 설정 파일에 지정되어 실행될 때 검사됩니다.
더 읽기 위해 귀속 리디렉션에 대한 Nick Craver의 우수한 게시물here을 추천합니다.
일을 더욱 복잡하게 하는 것은 모든 프로그램 집합이 프로그램이 시작될 때 불러오고 검사하는 것이 아니라는 것이다.우리는 일부 서버 사이드 루트만 Npgsql 프로그램 집합의 불러오기를 초래했기 때문에 메인 루트만 구축하고 실행하는 것은 부족하다는 것을 발견했다.
알겠습니다. 코드가 붕괴된 것을 알고 있기 때문에 이 귀속을 업데이트하겠습니다.그러나, 우리의 웹 응용 프로그램에서 가능한 모든 경로를 실행하기 전에, 우리는 어떻게 이 문제를 알 수 있습니까?
우리의 첫 번째 시도는
msbuild /warnaserror
로고를 사용하는 것이다.이 스위치를 사용하여 인쇄 NuGet 수준 복원 문제 (다운그레이드 경고) 에 대한 경고와 일치하지 않거나 완전히 누락된 바인딩 방향을 조정합니다.추가 정보here.C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2084,5): warning MSB3247: Found conflicts between different versions of the same dependent assembly.
In Visual Studio, double-click this warning (or select it and press Enter) to fix the conflicts; otherwise, add the following binding redirects to the "runtime" node in the application configuration file:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="System.Memory" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" /><bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /></dependentAssembly></assemblyBinding>
우리의 사례에서 우리는 아직 사용할 수 없다/warnaserror
. 왜냐하면 우리는 이 검증을 점차적으로 전개하기를 원하기 때문이다. 또한 다음과 같다.우리는 마침내 이 문제를 처리하기 위해 Powershell 스크립트를 만들었다.그것은 의존성이 없고 Powershell 5에서 테스트되었습니다.Check it out here if you're interested
그 기본 사상은 다음과 같다.
운송이 즐겁다!
Reference
이 문제에 관하여(실행 전 검증 프로그램 집합 리셋), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dustinsoftware/verifying-assembly-redirects-before-runtime-1p4g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)