.Net이 잘못된 참조 어셈블리 버전을 선택합니다.
개발을 시작하기 위해 기존 프로젝트를 새 컴퓨터에 복사했는데 참조된 어셈블리 중 하나의 버전(우연히 텔레릭 DLL)에서 문제가 발생했습니다.
이 프로젝트는 원래 어셈블리의 이전 버전을 참조했습니다(v1.0.0.0이라고 함).새 컴퓨터에 최신 버전의 어셈블리가 설치되어 있어서 업데이트를 해야겠다고 생각했습니다(새 버전을 v2.0.0.0이라고 부릅니다).
여기 문제가 있습니다.이전 v1.0.0.0 dll을 프로젝트 폴더에 복사하여 참조로 추가하면 웹 사이트가 문제 없이 시작됩니다.해당 참조를 삭제하고 시스템에서 이전 DLL도 삭제하고 새 버전(v2.0.0.0)을 추가하면 페이지에 다음 예외가 표시됩니다.
파일 또는 어셈블리 'XXXXX, 버전=1.0.0.0, Culture=neutral, PublicKey'를 로드할 수 없습니다.토큰=121fae78165ba3d4' 또는 해당 종속성 중 하나입니다.위치한 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT에서 제외: 0x80131040)
분명히, 코드는 오래된 버전을 찾고 있지만 찾을 수 없습니다.하지만 왜 그랬을까?
해당 버전 번호에 대한 솔루션 폴더를 그리프하여 참조를 하나도 찾을 수 없습니다..csproj 파일의 텍스트를 두 번 확인한 결과 버전이 최신 버전을 올바르게 표시하고 HintPath가 새 DLL의 경로를 올바르게 표시합니다.또한 이전 DLL을 시스템에 설치하지 않았기 때문에 GAC에 표시되지 않습니다(v2.0.0.0은 예상대로 설치합니다).
그런 다음 퓨전 로그 뷰어를 활성화하여 이전 버전을 찾는 이유를 알아내려고 했지만 실패했습니다.
Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.
=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
(Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
그 오래된 집회를 찾는 것으로 시작한다고 쓰여 있습니다.저는 온라인에서 해결책을 찾으려고 노력했고 이와 유사한 SO 질문을 보았지만, 그것은 제 문제와 정반대인 것 같습니다.그 질문자의 프로그램은 참조된 DLL 대신 잘못된 DLL을 찾고 있었습니다.반면에 저의 문제는 프로그램이 이상하게도 잘못된 DLL을 찾고 있고 bin 폴더와 GAC에서 로컬로 올바른 DLL을 찾을 수 있을 때 찾을 수 없다는 것입니다.
내 것은 왜 이전 버전을 찾는 거지?이 잘못된 참조를 찾기 위해 다른 곳을 검색할 수 있습니까?
당신이 사용하고 있는 다른 어셈블리가 이전 dll을 참조하고 있는 것 같습니다.사용 중인 다른 모든 프로젝트 참조에 대해 잘 알고 있으며, 그 중 텔레릭 dll에 대한 참조가 있습니까?
당신의 web.config 파일에 이렇게 바인딩 리다이렉트를 넣을 수 있습니까?
<dependentAssembly>
<assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
저는 대부분의 답을 시도했지만 여전히 작동하지 않았습니다.이것은 저에게 효과가 있었습니다.
참조 -> 속성 -> 를 마우스 오른쪽 버튼으로 클릭하여 '특정 버전'을 false로 변경합니다.
도움이 되길 바랍니다.
저는 이번 건에 대해 크리스 콘웨이와 함께 합니다.문제는 프로젝트에서 존재하지 않는 다른 텔레릭 어셈블리를 참조하는 것입니다.
첫 번째:저는 GAC에 어떤 공급업체(즉, 텔레릭) 어셈블리도 설치하지 않습니다.텔레릭의 자료는 어쨌든 두 개의 어셈블리로 컴파일됩니다(텔레릭).웹 디자인과 텔레릭.web.ui)를 선택합니다.애플리케이션과 함께 배포하기만 하면 됩니다.
. 파일 .에는 .proj 파일(예: .csproj)이 .<reference include..>
텔레릭을 가리킵니다. 파일vmdk.UI 파일입니다.여기에는 일반적으로 버전 번호가 포함됩니다.bin 폴더에 넣은 어셈블리가 해당 버전과 일치하는지 확인합니다.
셋째, 모든 프로젝트가 최신 어셈블리를 사용하는지 확인합니다.또한 GAC 대신 로컬 경로에서 어셈블리를 가져와야 합니다. (저는 GAC가 정말 마음에 들지 않습니다.)그것은 제가 진행했던 일부 프로젝트에 끝없는 문제를 야기했습니다.일반적으로 모든 프로젝트가 외부 어셈블리 참조에 사용하는 "어셈블리" 폴더가 있습니다.
넷째, 비주얼 스튜디오는 웹 사이트 프로젝트가 로드될 때마다 자동으로 gac을 검색하고 gac에서 무언가를 발견하면 어셈블리 위치를 다시 지정합니다.웹 애플리케이션 프로젝트에서 이런 일을 한 적이 있는지는 기억할 수 없지만, 오랫동안 이 문제를 겪지 않았습니다.이로 인해 배포 중에 유사한 문제가 발생할 수 있습니다.
다섯째, web.config에서 어셈블리의 버전 번호를 다시 바인딩할 수 있습니다.runtime/assemblybinding
섹션에서는 2008년에 구축된 모든 텔레릭 어셈블리를 앞으로 가져가서 매우 특정한 버전을 가리키는 다음과 같은 것을 사용할 수 있습니다.
<dependentAssembly>
<assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
<bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
</dependentAssembly>
시도:
- 임시 프로젝트 파일 정리
- 빌드 및 obj 파일 정리
- 설버정에 정리
C:\Users\USERNAME\.nuget\packages\
그것은 저에게 효과가 있었습니다.
- C:\로 이동WINDOWS\Microsoft.NET 프레임워크\v2.0.50727\구성
- machine.config 파일 찾기
- 메모장에서 여는
- 충돌 DLL 찾기
- 이것을 제거하고 저장합니다.
편집 조립품
addassembly=filename, Version=1.0.0000.0000 Culture=neutral, PublicKeyToken="QWEWQERWETERY"
조립품 편집
저한테는 효과가 있어요.
이는 왜 그런지에 대한 명확한 답변은 아니지만, 우리는 이러한 문제를 겪었고, 여기 우리의 상황과 그 문제를 해결한 것이 있습니다.
개발 1:
솔루션에는 NuGet 패키지를 참조하는 A 프로젝트와 A 프로젝트를 참조하는 MVC 프로젝트가 포함되어 있습니다.NuGet 패키지 복원을 실행한 다음 NuGet 패키지를 업데이트합니다.NuGetlib을 찾을 수 없다는 불만을 제기하는 런타임 오류가 발생했지만, 오류는 이전 버전의 업데이트되지 않은 버전을 찾는 것입니다.해결책(그리고 이것은 터무니없는 것입니다):MVC 프로젝트에서 A 프로젝트를 호출하는 코드의 첫 번째 줄에 중단점을 설정합니다.F11로 들어가세요.해결됨 - 다시는 문제가 발생하지 않음.
개발 2:
솔루션과 프로젝트는 동일하지만 매직 세트 브레이크포인트와 스텝인 솔루션이 작동하지 않습니다.버전 리디렉션 또는 이 Nuget 패키지에 대한 다른 잘못된 참조를 찾기 위해 모든 곳을 찾았고, 패키지를 제거하고 다시 설치했습니다. 삭제된 bin, obj, As.Net Temp, 아무것도 해결하지 못했습니다.마지막으로, A 프로젝트로 이름을 바꾸고, MVC 프로젝트를 실행했습니다 - 고정되었습니다.원래 이름으로 다시 이름을 바꾸고 고정 상태를 유지했습니다.
그게 왜 효과가 있었는지에 대한 설명은 없지만, 우리를 심각한 곤경에서 벗어나게 해주었습니다.
해당 솔루션에 다른 프로젝트가 있습니까?(이전 버전을 참조하고 있던 다른 프로젝트일 수 있음) 일반적으로 VS에서 dll 종속성은 솔루션의 모든 프로젝트에 적용됩니다.
저도 비슷한 문제가 있어서 제 문제를 해결하기 위해 bin과 obj 폴더에서 모든 것을 삭제하고 다시 작성해야 했습니다.이게 도움이 되길 바랍니다.
문제는 이전 어셈블리가 웹 응용 프로그램 아래의 _bin_deployableAssemblys 폴더에 있다는 것입니다.이는 프로젝트를 빌드할 때 이전 어셈블리가 GAC 어셈블리를 덮어쓰고 있다는 것을 의미합니다.
만약 다른 사람이 3시간을 절약한다면,제 경우는 좀 달랐습니다.내 코드는 DevExpress v11.1 v11.1.4.0을 사용했습니다.제 코드에서 모든 것을 올바르게 참조했습니다.그러나 .net 메모리 프로파일러는 GAC에 DevExpress v11.1 v11.1.12.0을 설치했습니다.실제로 실패한 것은 제가 참조한 구성 요소가 아니라 내부적으로 참조한 구성 요소입니다.제가 할 수 있는 한, GAC가 항상 먼저 확인됩니다.컴파일이 잘 되어 실행되었지만 Winforms 디자이너를 볼 수 없었고 스택 추적도 전혀 도움이 되지 않았습니다.마지막으로 .net 메모리 프로파일러를 제거하고 모두 복원했습니다.
이 오류는 다소 오해의 소지가 있습니다. x64 아키텍처를 지정해야 하는 일부 DLL을 로드하는 중이었습니다..csproj
파일 이름:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
<OutputPath>bin\Release-ABC</OutputPath>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
된 것PlatformTarget
이 오류를 발생시켰습니다.
제가 받은 것은:
파일 또는 어셈블리 'XXX-new-3.3.0.0' 또는 해당 종속성 중 하나를 로드할 수 없습니다.위치한 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT에서 제외: 0x80131040)
그것은 내가 집회의 이름을 바꾸었기 때문입니다.XXX.dll
XXX-new-3.3.0.0.dll
이름을 원래 이름으로 되돌리면 오류가 해결됩니다.
ASP(Visual Studio 환경)에서 응용 프로그램을 테스트하거나 디버깅할 때 이 문제가 발생하는 경우NET Development Server), 개발 웹 사이트 폴더의 모든 임시 파일을 삭제해야 합니다.해당 폴더의 위치를 알려면 ASP를 찾습니다.윈도우즈 트레이 아이콘의 NET Development Server 아이콘(ASP와 같은 제목이 있어야 함)NET Development Server - Port ###), 아이콘을 마우스 오른쪽 버튼으로 클릭하고 Show Details(세부 정보 표시)를 선택합니다. 그러면 Physical path(물리적 경로) 필드에서 임시 폴더가 무엇인지 알 수 있으므로 문제를 해결하려면 해당 폴더의 모든 항목을 삭제해야 합니다.웹 사이트를 빌드하고 다시 실행하면 문제가 해결됩니다(다시 말해 개발 환경의 경우 해결됨).
다른 버전의 Newtonsoft.json을 참조하는 다른 어셈블리에도 동일한 문제가 있었습니다.해결책은 Nuget Package Manager Console에서 update-package를 실행하는 것이었습니다.
마치 오래된 dll을 제거하기 위해 컴퓨터를 삭제해야 하는 것과 같습니다.이미 위의 모든 작업을 시도한 다음 의 모든 인스턴스를 삭제하는 추가 단계를 수행했습니다.응용프로그램에서 모든 참조를 제거하고 내 컴퓨터에 있는 DLL 파일.그러나 컴파일은 여전히 정상이며 실행 시 dll 함수를 참조하는 것도 정상입니다.저는 그것이 어떤 공유 네트워크 드라이브에서 그것을 참조하는 것인지 궁금해지기 시작했습니다.
동일한 DLL의 다른 버전을 참조하는 응용 프로그램의 두 버전을 전환할 때 동일한 메시지가 표시되었습니다.다른 폴더에서 테스트를 하고 있었지만 실수로 이전 버전보다 새 버전을 복사했습니다.
따라서 가장 먼저 확인해야 할 것은 응용프로그램의 폴더에 있는 참조 DLL의 버전입니다.혹시 모르니까요.
도움이 될 수도 있고 아닐 수도 있습니다.디버그 및 릴리스 버전을 정리한 후 OBJ 폴더 이름을 변경했습니다.이것은 마침내 저를 납득시켰습니다.이전 단계는 기본적으로 프로젝트에서 참조를 제거하고 프로젝트 속성에 참조를 다시 추가하는 것이었습니다.
My Visual Studio 2015에서 문제가 되는 Visual Studio 프로젝트의 참조 경로 목록이 비어 있는지 확인했습니다.
이것이 저에게 도움이 되었습니다.
제가 사용한 것입니다.Microsoft.IdentityModel.Clients.ActiveDirectory
버전 3.19는 클래스 라이브러리 프로젝트에서 사용되었지만 실제 ASP에는 버전 2.22만 설치되었습니다.NET 웹 응용 프로그램 프로젝트입니다.웹 앱 프로젝트에서 3.19로 업그레이드하는 것은 오류를 극복하게 했습니다.
저의 경우 3개의 프로젝트, 1개의 메인 프로젝트, 2개의 서브 프로젝트가 메인 프로젝트에서 참조되었습니다.그래서 하위 프로젝트는 생략하고 메인 프로젝트를 업데이트했습니다.거기서 갈등이 벌어졌습니다.프로젝트를 모두 업데이트한 후 모든 것이 잘 작동했습니다.
VS2017에서는 위의 모든 솔루션을 시도했지만 아무 것도 작동하지 않습니다.우리는 버전 관리를 위해 Azure devops를 사용하고 있습니다.
- 팀 탐색기 > 소스 제어 탐색기
당신을 오랫동안 미치게 하는 프로젝트를 선택하세요.
지점 또는 솔루션을 마우스 오른쪽 버튼으로 클릭 > 고급 > 특정 버전 가져오기
- 그런 다음 스크린샷에 따라 파일 덮어쓰기 확인란을 선택했는지 확인합니다.
저의 경우 실수로 nuget에서 Telerik 패키지의 잘못된 버전을 선택했는데, nuget은 제가 참조한 모든 패키지를 잘못된 버전으로 대체했습니다.그런 다음 잘못된 버전으로 바인딩 리디렉션을 삽입하여 모든 것을 올바른 버전으로 교체한 후에도 여전히 잘못된 버전을 찾고 있었습니다.
언급URL : https://stackoverflow.com/questions/4187907/net-picking-wrong-referenced-assembly-version
'programing' 카테고리의 다른 글
wpf에서 사용자 지정 윈도우 크롬을 만드는 방법은 무엇입니까? (0) | 2023.05.14 |
---|---|
원격 컴퓨터의 디스크 용량 및 여유 공간을 얻는 방법 (0) | 2023.05.09 |
Excel에서 셀 참조가 있는 테이블을 정렬하려면 어떻게 해야 합니까? (0) | 2023.05.09 |
Azure Container 인스턴스와 Web App for Container의 차이점은 무엇입니까? (0) | 2023.05.09 |
바이트 배열을 문자열로 변환하는 방법 (0) | 2023.05.09 |