ไม่สามารถโหลดไฟล์หรือชุดประกอบ“ System.Net.Http, เวอร์ชัน = 4.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = b03f5f7f11d50a3a”


168

ฉันได้คัดลอกโครงการของฉันไปยังเครื่อง Windows 10 ที่สะอาดแล้วโดยติดตั้ง Visual Studio 2015 Community และ SQL Server 2016 Express เท่านั้น ไม่มีเวอร์ชันเฟรมเวิร์กอื่น ๆ ที่ติดตั้งนอกเหนือจากที่ติดตั้งมากับ 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: \ การพัฒนา \ MyApp \ แพคเกจ \ Microsoft.AspNet.WebApi.Client.5.2.3 \ lib \ net45 \ System.Net.Http.Formatting.dll

โครงการทั้งหมดควรมีเป้าหมาย 4.5.1 หรือมีวิธีอื่นในการอ้างอิงชุดประกอบที่ถูกต้องหรือไม่?


คุณลองติดตั้ง Web Api ใหม่จากแพ็คเกจ NuGet หรือไม่
Mihai Alexandru-Ionut

เกี่ยวข้อง: stackoverflow.com/questions/19491860/…

ลองคำตอบที่แนะนำทั้งหมดในคำถาม SO นั้น จนถึงตอนนี้ยังไม่มีอะไรทำงาน ฉันยังใช้update-package xxx -reinstallงานแพ็คเกจ nuget ทั้งหมดที่ฉันใช้อยู่ มันไม่ทำงานเช่นกัน
Ivan-Mark Debono


เพียงแค่ดูนี้ขอบคุณฉันในภายหลังstackoverflow.com/questions/50536842/...
Ragul

คำตอบ:


115

ทำตามขั้นตอนต่อไปนี้

  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. ลบ snipped ด้านบนจาก.csprojไฟล์

มันควรจะทำงาน


1
ตอนนี้ฉันได้รับไม่สามารถโหลดไฟล์หรือชุดประกอบ 'Newtonsoft.Json, รุ่น = 6.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = 30ad4fe6b2a6aeed' หรือการอ้างอิงอย่างใดอย่างหนึ่ง คำจำกัดความรายการของชุดประกอบที่อยู่ไม่ตรงกับการอ้างอิงชุดประกอบ (ยกเว้นจาก HRESULT: 0x80131040)
EK_AllDay

2
คุณต้องจำไว้ว่าให้คัดลอกข้ามการเปลี่ยนเส้นทางที่มีผลผูกพันจากไฟล์ที่สร้างขึ้นดังนั้นครั้งแรกที่คุณจะได้รับข้อผิดพลาดข้างต้น แต่ได้รับโฟลเดอร์ bin เพื่อสร้าง (webappname) .dll.config ตามที่อธิบายไว้ข้างต้นคัดลอกรายการเปลี่ยนเส้นทางทั้งหมด ลงใน web.config ของคุณจากนั้นรวบรวมใหม่ สิ่งนี้ช่วยฉันได้จริงๆตรวจสอบให้แน่ใจว่าคุณใช้เครื่องมือการรวม nuget เพื่อล้างข้อมูลอ้างอิงให้ได้มากที่สุดก่อน
Chris Schaller

4
น่าอัศจรรย์ มันใช้งานได้จริงสำหรับฉัน @EK_AllDay คุณต้องคัดลอก AssemblyRedirects กลับไปที่ web.config ดั้งเดิม
David De Sloovere

3
⭐☝ตราสัญลักษณ์สมควรได้รับที่นี่! เพียงด้านทราบเมื่อผมคัดลอก AssemblyRedirects กลับเข้ามาใน web.config ผมเห็นว่ามีไม่มีผลผูกพันสำหรับ System.Net.Http ดังนั้นเราจึงสมมติว่า VS กำลังใช้ชุดประกอบเริ่มต้นที่จัดทำแพ็กเกจด้วย. NET Framework แทนที่จะเป็นรุ่นของตัวเอง
EvilDr

1
คำตอบนี้ช่วยฉันได้หลายครั้งแม้กระทั่งหยุดนับ ควรทำเครื่องหมายเป็นคำตอบ IMHO
เซบาสเตียน Budka

258

การเปลี่ยนข้อมูลที่มีผลผูกพันใน web.config ของฉัน (หรือ app.config) - ในขณะที่ "แฮ็ค" ในมุมมองของฉันช่วยให้คุณก้าวไปข้างหน้ากับโปรเจ็กต์ของคุณหลังจากที่แพ็คเกจ NuGet อัพเดทโปรแกรมของคุณ ความผิดพลาด

ตั้ง 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>

4
ฉันปรับใช้กับ Azure ครั้งเดียวโดยไม่มีปัญหาจากนั้น 15 นาทีต่อมาการปรับใช้อย่างต่อเนื่องทำให้ฉันมีข้อผิดพลาดที่ระบุไว้ใน OP และ tweaking web.config บนเซิร์ฟเวอร์ด้วยคำตอบที่แม่นยำนี้แก้ไขปัญหาของฉัน แต่ฉันไม่รู้ว่าทำไมมันถึงได้ผลในครั้งแรก ฉันไม่ได้ยุ่งกับการพึ่งพาระหว่างการปรับใช้
bkwdesign

8
ทำได้ดีมาก ฉันเห็นสิ่งที่เกิดขึ้นฉันติดตั้งแพคเกจในโครงการโดเมนพื้นฐานที่ฉันค่อนข้างแน่ใจว่าได้ติดตั้ง System.Net.Http nuget (อาจเป็นรุ่น 4.1.x ที่สูงกว่า) และทันทีที่ฉันได้รับสิ่งเหล่านี้ คำเตือนทุกที่ วิธีนี้แก้ไขปัญหาสำหรับโครงการเว็บ แต่คำแนะนำด้านบนของใครบางคนเพื่ออ้างอิงแพคเกจ nuget สำหรับที่ในทุกโครงการลบคำเตือนทั้งหมด ฉันเป็นคนเดียวที่กังวลเกี่ยวกับการผสมผสานของเก่าและใหม่. NET แม้ว่าเมื่อมันมาถึงการอ้างอิง? มันทำให้ฉันกลัวที่จะอ้างอิงที่กำลังท้องถิ่นเป็นแพคเกจ nuget (dll นรก)
Nicholas Petersen

3
นี่คือคำตอบจาก Microsoft ว่าเหตุใดจึงเป็นวิธีที่ถูกต้อง: github.com/dotnet/corefx/issues/25773
ghanashyaml

18
การลบการเปลี่ยนเส้นทางการเชื่อมโยงทำงานได้สมบูรณ์สำหรับฉัน
sbkrogers

1
ใช่เพียงลบบรรทัดของ system.net.http และ system.runtime ทุกอย่างก็ดีขึ้น
ZZZ

32

ในหนึ่งในโครงการของฉันมีแพ็กเกจ nuget ที่มี System.Net.Http เวอร์ชั่นที่สูงกว่า และในโครงการเริ่มต้นของฉันมีการอ้างอิงถึง System.Net.Http v 4.0.0 ฉันเพิ่งติดตั้งแพคเกจ nuget System.Net.Httpในโครงการเริ่มต้นของฉันและแก้ไขปัญหา


ฉันมีสามโครงการในการแก้ปัญหา - ขอเรียกพวกเขาA, และB เป็นโครงการที่เริ่มต้นและมีอะไรจะทำอย่างไรกับการอย่างใดอย่างหนึ่งหรือ เป็นโครงการสำหรับการทดสอบ การทดสอบการทำงานของฉันในการล้มเหลวเพราะผมไม่ได้มีการอ้างอิง (System.Net.Http) โครงการมี CABCCBCA
Rasmus Bækgaard

19

เปลี่ยนดังต่อไปนี้:

<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


1
คุณเป็นนักเลง นี่เป็นการแก้ไขปัญหาของฉัน!
Leonardo Wildt

1
ขอบคุณ @LeonardoWildt
Muhammad Waqas

12

หากคุณมีหลายโครงการในโซลูชันของคุณให้คลิกขวาที่ไอคอนโซลูชันใน Visual Studio และเลือก 'จัดการแพคเกจ NuGet สำหรับโซลูชัน' จากนั้นคลิกที่แท็บที่สี่ 'รวม' เพื่อรวมโครงการทั้งหมดของคุณเป็นเวอร์ชันเดียวกันของ ที่กำลัง นี่จะให้รายการของชุดประกอบที่อ้างอิงเพื่อรวม คลิกที่แต่ละรายการในรายการจากนั้นคลิกติดตั้งในแท็บที่ปรากฏทางด้านขวา


4
รวมสิ่งนี้กับคำตอบจาก @sajeetharan เกี่ยวกับการใช้ AutoGenerateBindingRedirects ดูเหมือนว่าแพ็คเกจ VS หรือแพคเกจ nuget รุ่นเก่าอาจออกจากคำสั่งการรวมที่ไม่ถูกต้อง การทำความสะอาดที่ดีสามารถช่วยได้มาก
Chris Schaller

11

ดังกล่าวข้างต้นผูกเปลี่ยนเส้นทางไม่ได้ทำงานให้ฉันเพื่อให้ฉันออกความเห็นการอ้างอิงถึงใน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>

1
สิ่งนี้ใช้งานได้ใน Visual Studio 2017 (15.9.4) และอนุญาตให้คุณสร้างด้วยแพ็คเกจ System.Net.Http (4.3.4) NuGet แทนการอ้างอิงโดยตรงไปยัง DLL ที่มาพร้อมกับ. NET 4.7.2 Framework release หากต้องการใช้การอ้างอิงที่จัดส่ง (โดยไม่มีการอ้างอิงอื่น ๆ ) ภายใน IDE ให้ทำสิ่งนี้: 1) ลบการเปลี่ยนเส้นทางการเชื่อมโยงเว็บ / app.config 2) ลบแพ็คเกจ NuGet สำหรับ System.Net.Http 3) เปิด "เพิ่มการอ้างอิงใหม่" และเชื่อมโยงโดยตรง เพื่อสร้าง 4.2.0.0 ใหม่ที่มาพร้อมกับ. NET 4.7
EnocNRoll - AnandaGopal Pardue

สิ่งนี้ใช้ได้กับฉันใน VS2019 การโอนย้ายแอปจาก 4.6.1 เป็น 4.7.2
cklimowski

ฉันมีโครงการแอปคอนโซลที่ทำงานเป็น webjob มีการส่งข้อยกเว้นนั้นเมื่อสร้างไคลเอนต์ SendGrid api ทุกอย่างเริ่มทำงานหลังจากลบการผูกมัดการเปลี่ยนเส้นทางจาก app.config ขอบคุณที่แนะนำสิ่งนี้ฉันไม่เคยคิดมาก่อน
kurdemol94

9

คุณสามารถแก้ไขได้โดยการอัพเกรดโครงการเป็น. NET Framework 4.7.2 นี้ได้รับการตอบโดยอเล็กซ์ Ghiondea - MSFT โปรดลงคะแนนเขาในขณะที่เขาสมควรได้รับอย่างแท้จริง!

นี่เป็นเอกสารที่เป็นปัญหาที่ทราบแล้วใน. NET Framework 4.7.1

คุณสามารถเพิ่มเป้าหมายเหล่านี้ในโครงการของคุณ พวกเขาจะลบ DesignFacadesToFilter ออกจากรายการการอ้างอิงที่ส่งไปยัง SGEN (และเพิ่มกลับไปเมื่อ 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.

คำตอบสำหรับคำถามลิงก์ด้านบนนี้เป็นคำตอบที่เกี่ยวข้องแล้ว: stackoverflow.com/a/52883065/54289 ดูความคิดเห็นเกี่ยวกับคำตอบสำหรับรายละเอียด
EnocNRoll - AnandaGopal Pardue

6

สิ่งนี้จะทำงานใน. NET 4.7.2 กับ Visual Studio 2017 (15.9.4):

  • ลบการเปลี่ยนเส้นทางการเชื่อมโยงเว็บ / app.config
  • ลบแพ็คเกจ NuGet สำหรับ System.Net.Http
  • เปิด "เพิ่มการอ้างอิงใหม่" และเชื่อมโยงโดยตรงกับบิลด์ 4.2.0.0 ใหม่ที่มาพร้อมกับ. NET 4.7.2

[ภาพ] (https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)


4

ฉันมีปัญหาเดียวกันและวิธีเดียวที่ฉันจะแก้ไขได้คือเพิ่ม bindingRedirect ให้กับ app.confing วิธีเขียน @ tripletdad99

แต่ถ้าคุณมีวิธีแก้ปัญหาด้วยโปรเจ็กต์มากกว่านั้นคือการอัพเดททุกครั้งด้วยมือ (และบางครั้งหลังจากอัพเดตแพ็กเกจ nuget บางอย่างคุณต้องทำอีกครั้ง) และมันเป็นเหตุผลว่าทำไมฉันถึงเขียน powerhell script ง่ายๆซึ่งถ้า app.configs ทั้งหมด

 param(
    [string]$SourceDirectory,
    [string]$Package,
    [string]$OldVersion,
    [string]$NewVersion
)

Write-Host "Start fixing app.config in $sourceDirectory"
Write-Host "$Package set oldVersion to $OldVersion and newVersion $NewVersion"
Write-Host "Search app.config files.."
[array]$files = get-childitem $sourceDirectory -Include app.config App.config -Recurse | select -expand FullName
foreach ($file in $files)
{
    Write-Host $file
    $xml = [xml](Get-Content $file)
    $daNodes = $xml.configuration.runtime.assemblyBinding.dependentAssembly
    foreach($node in $daNodes)
    {
        if($node.assemblyIdentity.name -eq $package)
        {
            $updateNode = $node.bindingRedirect
            $updateNode.oldVersion = $OldVersion
            $updateNode.newVersion =$NewVersion
            Write-Host "Fix"
        }
    }
    $xml.Save($file)
}

Write-Host "Done"

ตัวอย่างวิธีใช้:

./scripts/FixAppConfig.ps1 -SourceDirectory "C:\project-folder" -Package "System.Net.Http" -OldVersion "0.0.0.0-4.3.2.0" -NewVersion "4.0.0.0"

อาจจะไม่สมบูรณ์และจะดีกว่าถ้ามีคนเชื่อมโยงกับงานที่สร้างไว้ล่วงหน้า


3

4.6.1-2 ในผู้ใช้ VS2017 อาจพบว่าการแทนที่รุ่น System.Net.Http ที่ไม่พึงประสงค์โดย VS2017 หนึ่งตัวหรือ Msbuild 15 ต้องการใช้งาน

เราลบเวอร์ชันนี้ที่นี่:

C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

และที่นี่:

C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

จากนั้นโครงการจะสร้างด้วยเวอร์ชันที่เราอ้างอิงผ่าน NuGet


1

ฉันมีสิ่งนี้ แต่เป็นเพราะฉันได้เพิ่มแพ็คเกจ NuGet ที่ได้ปรับปรุงการเปลี่ยนเส้นทางการเชื่อมโยง เมื่อฉันลบแพ็คเกจการเปลี่ยนเส้นทางก็ยังอยู่ที่นั่น ฉันลบพวกเขาทั้งหมดแล้วจึงเรียกใช้ update-package - ติดตั้งใหม่ นี่เป็นการเพิ่มการเปลี่ยนเส้นทางที่ถูกต้อง


0

ตรวจสอบเวอร์ชัน. net framework
กรอบงาน. net ดั้งเดิมของฉันเป็นรุ่นที่เก่ากว่า
หลังจากฉันติดตั้ง. NET Framework 4.6 ปัญหานี้จะได้รับการแก้ไขโดยอัตโนมัติ


0

สำหรับฉันฉันได้ตั้งโครงการของฉันให้ทำงานบน. Net Framework เวอร์ชันล่าสุด (เปลี่ยนจาก. Net Framework 4.6.1 เป็น 4.7.2)

ทุกอย่างทำงานได้ไม่มีข้อผิดพลาดและเผยแพร่โดยไม่มีปัญหาและเป็นเพียงโอกาสที่ฉันเจอข้อความแสดงข้อผิดพลาด System.Net.Http ซึ่งแสดงเป็นคำขอขนาดเล็กที่ยากต่อการสังเกตเห็น แต่มีความสำคัญมากสำหรับเว็บไซต์ของฉัน ฉันกำลังทำงาน

ฉันย้อนกลับไปที่ 4.6.1 และทุกอย่างก็โอเคอีกครั้ง


0

วิธีเดียวที่แก้ไขปัญหานี้ให้ฉันได้อย่างหมดจด (. NET 4.6.1) ไม่เพียง แต่เพิ่มการอ้างอิง Nuget ให้กับ System.Net.Http V4.3.4 สำหรับโครงการที่ใช้ System.Net.Http แต่ยังรวมถึง โครงการเริ่มต้น (โครงการทดสอบในกรณีของฉัน)

(ซึ่งแปลกเพราะ System.Net.Http.dll ที่ถูกต้องมีอยู่ในไดเรกทอรีถังขยะของโครงการทดสอบและแอสเซมบลี .configBingings ดู OK เช่นกัน)


0

แก้ไขเว็บไซต์เก่าโดยใช้ nuget (รวมถึง. net update และ MVC update)

ฉันลบการอ้างอิง System.Net.HTTP ใน VS2017 (เป็นเวอร์ชัน 2.0.0.0) และเพิ่มการอ้างอิงอีกครั้งซึ่งแสดงเป็น 4.2.0.0

ฉันได้อัปเดต 'แพ็คเกจ' โดยใช้ nuget และได้รับข้อความแสดงข้อผิดพลาดจากนั้นสังเกตว่ามีบางสิ่งรีเซ็ตการอ้างอิงเป็น 2.0.0.0 ดังนั้นฉันจึงลบและเพิ่มใหม่อีกครั้งและทำงานได้ดี ... แปลกประหลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.