.NET 3.5 솔루션은 msbuild로 컴파일 할 때이 경고로 끝났습니다.
때로는 NDepend가 도움이 될 수 있지만이 경우 자세한 내용은 제공하지 않았습니다. Bob과 마찬가지로 이전 버전의 종속 어셈블리를 참조하는 어셈블리를 찾을 때까지 ILDASM에서 각 어셈블리를 여는 데 의존했습니다.
VS 2010 Beta 2에서 MSBUILD를 사용해 보았습니다 (Connect 기사에서 이것이 CLR의 다음 버전에서 수정되었다고 표시했지만).
더 나은 (보다 자동화 된) 접근 방식이 있습니까?
답변
“MSBuild 프로젝트 빌드 출력 상세”를 “상세”이상으로 변경하십시오. 이렇게하려면 다음 단계를 수행하십시오.
- 옵션 대화 상자를 엽니 다 ( 도구-> 옵션 … ).
- 왼쪽 트리에서 프로젝트 및 솔루션 노드를 선택한 다음 빌드 및 실행 을 선택 하십시오 .
- 참고 :이 노드가 표시되지 않으면 모든 설정 표시 대화 상자 하단의 확인란이 선택되어 있는지 확인하십시오 .
-
도구 / 옵션 페이지가 나타나면 버전에 따라 MSBuild 프로젝트 빌드 출력 상세 레벨을 적절한 설정으로 설정하십시오.
- 진단 할 때 VS2012, VS2013 또는 VS2015 (이 버전에서 메시지가 말했다 당신은 “상세”를 사용한다, 그러나 이것은 명백히 잘못, 당신은 “진단”을 사용해야한다 )
- VS2010에있을 때 자세히 설명
- VS2008 이상에서는 보통으로 충분합니다.
- 프로젝트를 빌드하고 출력 창을보십시오.
MSBuild 메시지를 확인하십시오. ResolveAssemblyReferences
MSB3247 유래, 당신이 특정 문제를 디버깅하는 데 도움이되어야하는 작업입니다 작업.
내 특정 사례는 SqlServerCe에 대한 잘못된 참조였습니다. 아래를 참조하십시오. 두 가지 버전의 SqlServerCe를 참조하는 두 개의 프로젝트가 있습니다. 이전 버전의 프로젝트로 이동하여 참조를 제거한 다음 올바른 참조를 추가했습니다.
Target ResolveAssemblyReferences:
Consider app.config remapping of assembly "System.Data.SqlServerCe, ..."
from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll]
to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
to solve conflict and get rid of warning.
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets :
warning MSB3247: Found conflicts between different versions of the same dependent assembly.
참조 된 어셈블리의 버전을 확인하기 위해 각 어셈블리를 열 필요는 없습니다.
- 각 참조의 속성을 확인할 수 있습니다.
- 프로젝트 속성을 열고 참조 섹션의 버전을 확인하십시오.
- 텍스트 편집기로 프로젝트를 엽니 다.
- .Net 리플렉터를 사용하십시오.
답변
Mike Hadlow는 AsmSpy라는 작은 콘솔 응용 프로그램을 게시했으며 각 어셈블리의 참조를 멋지게 나열합니다.
Reference: System.Net.Http.Formatting
4.0.0.0 by Shared.MessageStack
4.0.0.0 by System.Web.Http
Reference: System.Net.Http
2.0.0.0 by Shared.MessageStack
2.0.0.0 by System.Net.Http.Formatting
4.0.0.0 by System.Net.Http.WebRequest
2.0.0.0 by System.Web.Http.Common
2.0.0.0 by System.Web.Http
2.0.0.0 by System.Web.Http.WebHost
이것은 MSBuild 출력에 의존하는 것보다 경고 MSB3247의 맨 아래에 도달하는 훨씬 빠른 방법입니다.
답변
때로는 @AMissico의 답변으로는 충분하지 않습니다. 필자의 경우 출력 창에서 오류를 찾을 수 없으므로 다음 단계를 수행하여 로그 파일을 만들고 분석하기로 결정했습니다.
-
빌드 로그를 파일로 저장 중 … https://msdn.microsoft.com/en-us/library/ms171470.aspx
msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed
-
텍스트를 찾
warning MS...
거나 특정 경고 정보 🙁 예 : 9293 행)Found conflicts between different versions...
충돌 오류에 대한 자세한 내용은이 메시지보다 위에 있습니다 (예 : 9277 행)There was a conflicts between...
Visual Studio 2013
답변
나는 적어도 Visual Studio 2010에서 문제를 발견 할 수 있도록 출력 세부 정보를 최소 상세로 설정해야한다는 것을 알았습니다.
내 문제는 이전에 GAC 참조였던 참조 일 수도 있지만 내 컴퓨터를 다시 설치 한 후에는 더 이상 문제가되지 않았습니다.
답변
나는 같은 오류가 있었고 다른 대답으로 알아낼 수 없었습니다. NuGet 패키지를 “통합”할 수 있다는 것을 알았습니다.
- 솔루션을 마우스 오른쪽 버튼으로 클릭하십시오
- Nuget 패키지 관리를 클릭하십시오.
- 탭을 통합하고 동일한 버전으로 업데이트하십시오.
답변
기본 ASP.NET MVC 4 베타에 대해 생성 된이 경고는
여기를 참조하십시오.
프로젝트의 .csproj 파일을 수동으로 편집하여이 경고를 제거 할 수 있습니다.
modify …….. : 참조 Include = “System.Net.Http”
읽을 내용 : 참조 Include = “System.Net.Http, Version = 4.0.0.0”
답변
의존성 리더 사용
dep.exe 를 사용 하면 전체 폴더의 모든 중첩 된 종속성을 나열 할 수 있습니다. grep 또는 awk와 같은 유닉스 도구와 결합하면 문제를 해결하는 데 도움이 될 수 있습니다
둘 이상의 버전에서 참조되는 어셈블리 찾기
$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; } END{ for(e in errors) print e } '
System.Web.Http
이 모호한 명령 행은 dep.exe를 실행 한 다음 출력을 두 번 awk
- 부모와 자식을 단일 열에 넣습니다 (기본적으로 각 줄에는 부모와 자식이 포함되어있어이 부모가 해당 자식에 의존한다는 사실을 나타냅니다)
- 그런 다음 연관 배열을 사용하여 일종의 ‘그룹화’를 수행하십시오.
이 어셈블리를 휴지통에서 가져 오는 방법 이해
$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1
이 예제에서 도구는 System.Web.Http 5.2.3이 FooLib에 대한 종속성에서 비롯된 반면 버전 4.0.0은 BarLib에서 제공됨을 보여줍니다.
그런 다음 사이에서 선택할 수 있습니다
- 라이브러리 소유자에게 동일한 버전을 사용하도록 설득
- 그들 중 하나를 사용 중지
- 최신 버전을 사용하도록 구성 파일에 바인딩 리디렉션 추가
Windows에서 이러한 작업을 실행하는 방법
유닉스 타입 쉘이 없다면 awk
and 를 실행하기 전에 하나를 다운로드해야한다 grep
. 다음 중 하나를 시도하십시오