[C#] 파일 또는 어셈블리 “System.Net.Http, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a”를로드 할 수 없습니다.

Visual Studio 2015 Community 및 SQL Server 2016 Express 만 설치된 깨끗한 Windows 10 컴퓨터에 프로젝트를 복사했습니다. Windows 10 및 VS2015 또는 SQL Server와 함께 설치된 다른 프레임 워크 버전은 없습니다.

WebApi 프로젝트를 시작하려고하면 다음 메시지가 나타납니다.

파일 또는 어셈블리 “System.Net.Http, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a”또는 해당 종속성 중 하나를로드 할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다.

프로젝트 패키지에는 다음이 포함됩니다.

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />

.NET Framework 4.6.1을 사용하여 프로젝트를 빌드 한 후 폴더 System.Net.Http에 파일이 없습니다 bin.

파일의 경로는 다음을 가리 킵니다.

C : \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Net.Http.dll

파일의 경로는 다음을 System.Net.Http.Formatting가리 킵니다.

C : \ Development \ MyApp \ packages \ Microsoft.AspNet.WebApi.Client.5.2.3 \ lib \ net45 \ System.Net.Http.Formatting.dll

전체 프로젝트가 4.5.1을 대상으로해야합니까, 아니면 올바른 어셈블리를 참조 할 수있는 다른 방법이 있습니까?



답변

다음 단계를 따르십시오

  1. Visual Studio를 최신 버전으로 업데이트 (중요)
  2. 에서 모든 바인딩 리디렉션 제거 web.config
  3. 이것을 .csproj파일에 추가 하십시오 :

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. 프로젝트 구축
  5. 에서 bin폴더이 있어야 (WebAppName).dll.config파일
  6. 여기에 리디렉션이 있어야합니다. web.config
  7. .csproj파일 에서 스니핑 된 위를 제거하십시오.

작동해야합니다


답변

내 web.config (또는 app.config)의 바인딩 정보 변경-내보기의 “해킹”동안 NuGet 패키지 업데이트가 응용 프로그램을 해킹하고 System.Net.Http를 제공 한 후 프로젝트를 진행할 수 있습니다. 오류.

newVersion = “4.0.0.0”설정

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.0.0.0" />
</dependentAssembly>


답변

내 프로젝트 중 하나에는 더 높은 버전의 System.Net.Http가있는 너겟 패키지가있었습니다. 시작 프로젝트에서 System.Net.Http v 4.0.0을 참조하면 시작 프로젝트에 System.Net.Http nuget 패키지 가 설치되어 문제가 해결되었습니다.


답변

다음과 같이 변경하십시오.

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />

다음과 같이 :

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0" />

web.config에서


답변

솔루션에 여러 프로젝트가있는 경우 Visual Studio에서 솔루션 아이콘을 마우스 오른쪽 버튼으로 클릭하고 ‘Manage NuGet Packages for Solution’을 선택한 다음 네 번째 탭 ‘Consolidate’를 클릭하여 모든 프로젝트를 동일한 버전의 DLL. 그러면 통합 할 참조 어셈블리 목록이 제공됩니다. 목록에서 각 항목을 클릭 한 다음 오른쪽에 나타나는 탭에서 설치를 클릭하십시오.


답변

나는에 대한 참조를 주석 때문에 위의 바인드 리디렉션 나를 위해 작동하지 않았다 System.Net.Http에서 web.config. 그것 없이는 모든 것이 잘 작동하는 것 같습니다.

  <system.web>
    <compilation debug="true" targetFramework="4.7.2">
      <assemblies>
        <!--<add assembly="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />-->
        <add assembly="System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <httpRuntime targetFramework="4.7.2" />
  </system.web>


답변

프로젝트를 .NET Framework 4.7.2로 업그레이드하여이 문제를 해결할 수 있습니다. 이것은 Alex Ghiondea-MSFT에 의해 답변되었습니다 . 그가 진정으로 가치가 있기 때문에 그를 찬양하십시오!

.NET Framework 4.7.1에서 알려진 문제로 설명되어 있습니다.

해결 방법으로 이러한 대상을 프로젝트에 추가 할 수 있습니다. SGEN에 전달 된 참조 목록에서 DesignFacadesToFilter를 제거하고 SGEN이 완료되면 다시 추가합니다.

<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" />
    <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')"
        Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" />
    <ReferencePath Remove="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target>

<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <ReferencePath Include="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." />
</Target>

다른 옵션 (시스템 전체)은 sgen.exe.config에 다음 바인딩 리디렉션을 추가하는 것입니다.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.