2017-09-05 20 views
0

MVC 및 WebAPI가있는 DotNet 4.6.1 응용 프로그램이 있습니다. MVC 측에 GlobalConfiguration.Configuration이 있고 WebAPI에 Assembly1에 대한 종속성이 있습니다.DotNet 의존성 지옥에서 왜 내가 빠져 나갈 수 있습니까?

분명히 GlobalConfiguration.Configuration의 System.Web.Http는 "Newtonsoft.Json, Version = 6.0.0.0"에 종속되어 있으며 Assembly1에는 종속성이 있습니다. "Newtonsoft.Json", 버전 = 7.0.1. 내 WebApi에 대해 핑을 실행하려고하면 내가 얻을 :

나는이 정확한 의존성이 정확하게 때문에 그 인용을 배치

내 Web.config를 Microsoft에서 NuGet에 의해 추가 생성 된
"Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies" 

그래서 지금까지 나는 그것을 만지지 않았고, 나를 위해 지어졌다. 의 Web.config의 구조는 다음과 같습니다

<!--Personal Comment: See how configuration has no namespace--> 
<configuration> 
    <runtime> 
     <!--Personal Comment: See how assemblyBinding DOES have namespace--> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <!--Left out all of the other dependentAssemblies for brevity--> 
      <dependentAssembly> 
       <!--Personal Comment: Take note the upper/lowercase of attributes--> 
       <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"> 
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0 newVersion="7.0.0.0" /> 
       </assemblyIdentity> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

내가 VSCode에 .csproj로 이동하여 참조를 변경하면 이상한 것은, = "Newtonsoft.Json"를 포함하고 버전 = 7.0.0.0을 제거하는 것입니다, 등등 ... 그러면 아무 것도 고쳐지지 않습니다. 그러나 버전 = 7.0.0.0을 버전 6.0.0.0으로 변경하고 7.0.1으로 hintpath를 지정하면 솔루션이 작동합니다!

이것은 살기 좋고 프로그램하기에는 끔찍한 방법 인 것처럼 보이며, 내가 처리하지 않으면 좋아하지 않습니다. 온라인으로 읽은 모든 기사에 따르면, 모든 질문, 모든 대답, 그들은 모두 "bindingRedirect 사용"이라고 말하면서 사용하는 방식으로 사용합니다. 내 가정은 bindingRedirect가 내 코드에서 작동하지 않는다는 것입니다. 이유를 알아야하거나, Newtonsoft.Json을 내 참조에서 두 번 참조하고 컴파일러에게 타사 프로젝트가 아닌 경우 7.0.0.0 코드를 사용하도록 할 수 있습니까?

+0

은 모든 것을 최신 버전으로 업그레이드하고 있습니까? – BOR4

+0

아니요. 이 시나리오에서 사용하는 옵션은 MVC 부분 만 완전히 제거하는 것입니다. MVC는 부트 스트랩 코드로 작성되었으며 사용되지 않습니다. 그러나 내가 "그게 답"이라고 말할 수없는 이유는 dotnet 2.0 코드 기반을 유지하면서이 문제를 여러 번 보았 기 때문에이 문제를 한 번에 해결할 필요가 있다는 것입니다. 다시 일어날 때해야 할 일. – user3654055

+0

소스 제어 형식을 사용하고 있습니까? – JuanR

답변

0

이전에 비슷한 문제가 발생했습니다. 이것을 시도하십시오 :

  • 사용하는 모든 프로젝트에서 Json 종속성을 제거하십시오.
  • 솔루션을 닫습니다.
  • SUO 파일을 삭제하십시오. .SUO 확장명을 가진 솔루션의 이름과 동일합니다.
  • 솔루션을 다시 시작하십시오.
  • 용액을 닦으십시오.
  • 필요한 프로젝트에 원하는 Json 종속성을 추가하십시오.
  • 솔루션을 다시 빌드하십시오.
  • 확인을 위해 실행하십시오.

이유는 Visual Studio가 SUO 파일의 참조를 "캐시"하는 것으로 보입니다.

여전히 오작동하는 경우 컴파일러를 자세한 정보로 설정하고 다시 작성하십시오. 출력에서 불일치의 정확한 원인을 알려야합니다.

+0

고마워,이 환상적인 조언입니다. 그것은 여전히 ​​작동하지 않지만 컴파일러를"Diagnostic "으로 설정하고 Newtonsoft.Json에 대한 많은 참조를 발견하고"대신이 버전 사용 web.config의 bindingRedirect (및 AutoUnify가 true 인 다른 패키지) 때문에 * 패키지 *의 원본 버전 "6.0.0.0" 그래서 bindingRedirect가 작동하는 것을 볼 수 있습니다. 그러나 이것이 작동하지 않는 이유는 이해가되지 않습니다. 산출물에서 무엇을 찾고 있습니까? 진행할 디버그 라인이 60,000 개 있고 도움이 될만한 예산이 있다고 생각하지 않습니다. – user3654055

+0

오류가 발생한 순간에 로그 항목을 찾으십시오. 당신이하고 싶은 일은 이것을 먼저 일으키는 구성 요소를 확인한 다음 그 이유를 이해하는 것입니다. – JuanR

+0

나는 지난 몇 주 동안이 일주일 내내 토스트되었다. 나는 독자적으로이 일을 다시 시도하려고하지만, 지금은 6.0.0.0 레퍼런스를 추가하고 System.Net.Http.Formatting에 문제를 게시하여 함께 모이고 종속 버전 번호를 제거합니다. https://github.com/aspnet/AspNetWebStack. 감사합니다. 적어도 올바른 방향으로 나아가는 단계이므로 답변으로 표시하겠습니다. – user3654055

0

NuGet을 사용하여 모든 종속성을 관리하는 경우 Manage NuGet Packages for Solution을 열고 각 프로젝트를 최신 버전의 패키지 (이 경우 NewtonSoft.JSON)로 업그레이드 할 수 있습니다. 더 이상 참조되지 않으면 이전 패키지 버전이 제거됩니다.

+0

문제가 계속 발생합니다 system.Web.Http는 6.0.0.0에 종속 된 것처럼 보입니다. 이 프로젝트에서 나는 System.Web.Http를 제거 할 수있다. 그러나 다른 많은 프로젝트들에서 (단지 잠시 전에 방영 됨) System.Web.Http를 제거 할 수없고, 모든 것을 업 그레 이드 " – user3654055

관련 문제