Tidak dapat memuat file atau rakitan “System.Net.Http, Versi = 4.0.0.0, Culture = netral, PublicKeyToken = b03f5f7f11d50a3a”

168

Saya telah menyalin proyek saya ke mesin Windows 10 yang bersih dengan hanya Visual Studio 2015 Community dan SQL Server 2016 Express yang diinstal. Tidak ada versi kerangka kerja lain yang diinstal selain yang diinstal dengan Windows 10 dan VS2015 atau SQL Server.

Ketika saya mencoba memulai proyek WebApi saya mendapatkan pesan:

Tidak dapat memuat file atau rakitan "System.Net.Http, Versi = 4.0.0.0, Culture = netral, PublicKeyToken = b03f5f7f11d50a3a" atau salah satu dari ketergantungannya. Sistem tidak dapat menemukan berkas yang dicari.

Paket-paket proyek meliputi:

<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" />

Setelah membangun proyek dengan .NET Framework 4.6.1, System.Net.Httpfile tidak ditemukan di binfolder.

Jalur file menunjuk ke:

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

Jalur file System.Net.Http.Formattingmenunjuk ke:

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

Haruskah seluruh target proyek 4.5.1 atau adakah cara lain untuk merujuk majelis yang tepat?

Ivan-Mark Debono
sumber
Sudahkah Anda mencoba menginstal ulang Web Api dari paket NuGet?
Mihai Alexandru-Ionut
Sudah mencoba semua jawaban yang disarankan dalam pertanyaan SO itu. Sejauh ini tidak ada yang berhasil. Saya juga menjalankan update-package xxx -reinstalluntuk semua paket nuget yang saya gunakan. Itu juga tidak berhasil.
Ivan-Mark Debono
Warisan detik
Michael Freidgeim
Cukup rujuk ini, terima kasih nanti stackoverflow.com/questions/50536842/...
Ragul

Jawaban:

116

Ikuti langkah-langkah berikut,

  1. Perbarui studio visual ke versi terbaru (itu penting)
  2. Hapus semua pengalihan yang mengikat dari web.config
  3. Tambahkan ini ke .csprojfile:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Bangun proyek
  5. Di binfolder itu harus ada (WebAppName).dll.configfile
  6. Seharusnya ada arahan ulang di dalamnya, salin ini ke web.config
  7. Hapus potongan di atas dari .csprojfile

Itu harus bekerja

Sajeetharan
sumber
1
Sekarang saya mendapatkan Tidak dapat memuat file atau rakitan 'Newtonsoft.Json, Versi = 6.0.0.0, Budaya = netral, PublicKeyToken = 30ad4fe6b2a6aeed' atau salah satu dari dependensinya. Definisi manifes rakitan yang ditemukan tidak cocok dengan rujukan rakitan. (Pengecualian dari HRESULT: 0x80131040)
EK_AllDay
2
Anda harus ingat untuk menyalin di seluruh pengalihan yang mengikat dari file yang dihasilkan, jadi pertama kali Anda akan mendapatkan kesalahan di atas, tetapi pergi folder bin untuk mendapatkan dihasilkan (webappname) .dll.config seperti dijelaskan di atas, salin seluruh daftar pengalihan ke web.config Anda, lalu kompilasi ulang. Ini sangat membantu saya, pastikan Anda menggunakan alat konsolidasi nuget untuk membersihkan referensi sebanyak yang Anda bisa dulu.
Chris Schaller
4
Luar biasa. Ini sebenarnya bekerja untuk saya. @EK_AllDay Anda harus menyalin kembali AssemblyRedirects ke web.config asli.
David De Sloovere
3
⭐☝ Lencana legenda pantas ada di sini! Hanya catatan tambahan, ketika saya menyalin kembali AssemblyRedirects ke web.config, saya melihat bahwa tidak ada lagi yang mengikat untuk System.Net.Http . Jadi kita mengasumsikan bahwa VS sekarang menggunakan perakitan default yang dikemas dengan framework .Net, bukan versi sendiri?
EvilDr
1
Jawaban ini menyelamatkan saya berkali-kali bahkan saya berhenti menghitung. Harus ditandai sebagai jawaban IMHO.
Sebastian Budka
258

Mengubah informasi yang mengikat di web.config saya (atau app.config) - sementara "hack" dalam pandangan saya, memungkinkan Anda untuk bergerak maju dengan proyek Anda setelah paket NuGet memperbarui aplikasi Anda dan memberi Anda System.Net.Http kesalahan.

Set 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>
tripletdad99
sumber
4
Saya dikerahkan ke Azure, sekali, tanpa masalah, lalu 15 menit kemudian, penerapan yang berurutan memberi saya kesalahan yang dinyatakan dalam OP dan mengubah web.config di server dengan jawaban yang tepat ini memperbaiki masalah saya. Tapi, saya tidak tahu mengapa ini berhasil pertama kali. Saya tidak mengacaukan ketergantungan saya di antara penyebaran.
bkwdesign
8
Kerja bagus. Saya dapat melihat apa yang terjadi, saya menginstal sebuah paket dalam proyek domain dasar yang saya cukup yakin telah menginstal nuget System.Net.Http (mungkin dari versi 4.1.x yang lebih tinggi), dan segera setelah saya melakukannya saya mendapatkan ini peringatan di mana-mana. Ini memperbaiki masalah untuk proyek web, tetapi saran di atas seseorang untuk merujuk paket nuget untuk itu di semua proyek menghapus semua peringatan. Apakah saya satu-satunya yang peduli tentang campuran .NET lama dan baru meskipun ketika datang ke referensi? Itu membuat saya takut untuk merujuk dll lokal biasanya sebagai paket nuget (dll neraka).
Nicholas Petersen
3
Berikut ini jawaban dari Microsoft mengenai mengapa ini adalah cara yang benar: github.com/dotnet/corefx/issues/25773
ghanashyaml
18
Menghapus pengalihan yang mengikat sepenuhnya bekerja untuk saya.
sbkrogers
1
Ya, cukup hapus baris system.net.http dan system.runtime. Segalanya menjadi baik-baik saja.
ZZZ
32

Di salah satu proyek saya ada paket nuget dengan versi System.Net.Http yang lebih tinggi. dan dalam proyek startup saya ada referensi untuk System.Net.Http v 4.0.0, saya baru saja menginstal paket nuget System.Net.Http dalam proyek startup saya dan masalah terpecahkan

Ram
sumber
Saya punya tiga proyek dalam solusi - sebut saja A, Bdan C. Aadalah proyek startup, dan tidak ada hubungannya dengan salah satu Batau C. Cadalah proyek uji untuk B. Menjalankan tes saya Cgagal, karena saya tidak punya proyek referensi (System.Net.Http) A.
Rasmus Bækgaard
19

Ubah yang berikut:

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

dengan yang berikut ini:

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

di web.config

Muhammad Waqas
sumber
1
Anda seorang gangster. Ini menyelesaikan masalah saya!
Leonardo Wildt
1
Terima kasih @LeonardoWildt
Muhammad Waqas
12

Jika Anda memiliki beberapa proyek dalam solusi Anda, kemudian klik kanan pada ikon solusi di Visual Studio dan pilih 'Kelola Paket NuGet untuk Solusi', lalu klik pada tab keempat 'Konsolidasi' untuk mengkonsolidasikan semua proyek Anda ke versi yang sama dari DLL. Ini akan memberi Anda daftar majelis referensi untuk dikonsolidasikan. Klik pada setiap item dalam daftar, lalu klik instal pada tab yang muncul di sebelah kanan.

Pencari kebenaran
sumber
4
Kombinasikan ini dengan jawaban dari @sajeetharan tentang penggunaan AutoGenerateBindingRedirects, tampaknya versi lama dari paket VS atau nuget dapat meninggalkan pernyataan yang salah. Pembersihan yang baik dapat banyak membantu.
Chris Schaller
11

Bind-redirect di atas tidak berfungsi untuk saya, jadi saya berkomentar referensi System.Net.Httpdi web.config. Segalanya tampak berjalan baik tanpa itu.

  <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>
Menandai
sumber
1
Ini berfungsi di Visual Studio 2017 (15.9.4) dan memungkinkan Anda untuk membangun dengan paket NuGet System.Net.Http (4.3.4) alih-alih referensi langsung ke DLL yang dikirimkan dengan rilis kerangka kerja .NET 4.7.2. Untuk menggunakan referensi yang dikirim (tanpa ada ketergantungan lain yang diperkenalkan) dalam IDE lakukan ini: 1) Hapus pengalihan web / app.config mengikat 2) Hapus paket NuGet untuk System.Net.Http 3) Buka "Tambah Referensi Baru" dan langsung tautkan ke bangunan 4.2.0.0 baru yang dikirimkan dengan .NET 4.7.
EnocNRoll - AnandaGopal Pardue
Ini bekerja untuk saya di VS2019, memigrasikan aplikasi dari 4.6.1 ke 4.7.2
cklimowski
Saya memiliki proyek aplikasi konsol yang berfungsi sebagai webjob. Itu melempar pengecualian itu saat membuat klien api SendGrid. Semuanya mulai berfungsi setelah menghapus pengalihan yang mengikat dari app.config. Terima kasih telah menyarankan ini, saya tidak akan pernah berpikir.
kurdemol94
9

Anda dapat memperbaikinya dengan memutakhirkan proyek Anda ke .NET Framework 4.7.2. Ini dijawab oleh Alex Ghiondea - MSFT . Tolong angkat dia karena dia benar-benar layak mendapatkannya!

Ini didokumentasikan sebagai masalah yang diketahui di .NET Framework 4.7.1.

Sebagai solusi, Anda dapat menambahkan target ini ke proyek Anda. Mereka akan menghapus DesignFacadesToFilter dari daftar referensi yang diteruskan ke SGEN (dan menambahkannya kembali setelah SGEN selesai)

<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>

Opsi lain (lebar mesin) adalah menambahkan pengalihan ikatan berikut ke 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.
Boško Bezik
sumber
Jawaban pada pertanyaan tautan di atas sekarang adalah jawaban yang relevan: stackoverflow.com/a/52883065/54289 Lihat komentar pada jawaban untuk detailnya.
EnocNRoll - AnandaGopal Pardue
6

Ini akan bekerja di .NET 4.7.2 dengan Visual Studio 2017 (15.9.4):

  • Hapus pengalihan web / app.config yang mengikat
  • Hapus paket NuGet untuk System.Net.Http
  • Buka "Tambahkan Referensi Baru" dan langsung tautkan ke bangunan 4.2.0.0 baru yang dikirimkan bersama .NET 4.7.2

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

EnocNRoll - AnandaGopal Pardue
sumber
4

Saya memiliki masalah yang sama dan satu-satunya cara bagaimana saya dapat memperbaikinya adalah menambahkan bindingRedirect ke app.confing bagaimana wrote @ tripletdad99.

Tetapi jika Anda memiliki solusi dengan lebih banyak proyek benar-benar menyedot pembaruan setiap proyek dengan tangan (dan juga kadang-kadang setelah memperbarui beberapa paket nuget Anda perlu melakukannya lagi). Dan itu adalah alasan mengapa saya menulis skrip PowerShell sederhana yang jika semua 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"

Contoh cara menggunakan:

./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"

Mungkin itu tidak sempurna dan juga akan lebih baik jika seseorang menghubungkannya dengan tugas pra-bangun.

Jiri Sykora
sumber
3

4.6.1-2 di VS2017 pengguna dapat mengalami penggantian yang tidak diinginkan dari versi System.Net.Http mereka dengan yang ingin digunakan oleh VS2017 atau Msbuild 15.

Kami menghapus versi ini di sini:

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

dan di sini:

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

Kemudian proyek dibangun dengan versi yang telah kami rujuk melalui NuGet.

Jaybro
sumber
1

Saya punya ini, tapi, itu karena saya telah menambahkan paket NuGet yang telah memperbarui pengalihan yang mengikat. Setelah saya menghapus paket itu, arahan ulang masih ada. Saya menghapus semuanya, dan kemudian menjalankan pembaruan-paket-instal. Ini menambahkan pengalihan yang benar.

SwampyFox
sumber
0

Periksa versi .net framework.
Kerangka kerja .net asli saya adalah versi yang lebih lama.
Setelah saya menginstal .net framework 4.6, masalah ini secara otomatis diselesaikan.

Frank Myat Thu
sumber
0

Bagi saya, saya telah mengatur proyek saya untuk berjalan pada versi terbaru .Net Framework (perubahan dari .Net Framework 4.6.1 ke 4.7.2).

Semuanya berfungsi, tidak ada kesalahan dan diterbitkan tanpa masalah, dan hanya kebetulan saya menemukan pesan kesalahan System.Net.Http, ditampilkan dalam permintaan API kecil, sulit untuk diketahui, tetapi cukup penting di situs web saya. sedang mengerjakan.

Saya kembali ke 4.6.1 dan semuanya baik-baik saja lagi.

Stuart Aitken
sumber
0

Satu-satunya cara yang dengan bersih menyelesaikan masalah ini untuk saya (.NET 4.6.1) adalah tidak hanya menambahkan referensi Nuget ke System.Net.Http V4.3.4 untuk proyek yang benar-benar menggunakan System.Net.Http, tetapi juga ke proyek startup (proyek uji dalam kasus saya).

(Yang aneh, karena System.Net.Http.dll yang benar ada di direktori bin dari proyek pengujian dan .config assemblyBingings tampak OK juga.)

DVDH
sumber
0

Sedang memperbarui situs web lama menggunakan nuget (termasuk pembaruan .Net dan pembaruan MVC).

Saya menghapus referensi System.Net.HTTP di VS2017 (itu ke versi 2.0.0.0) dan menambahkan kembali referensi, yang kemudian menunjukkan 4.2.0.0.

Saya kemudian memperbarui satu ton 'paket' menggunakan nuget dan mendapatkan pesan kesalahan, kemudian melihat ada sesuatu yang mengatur ulang referensi ke 2.0.0.0, jadi saya menghapus dan menambahkan lagi dan berfungsi dengan baik ... aneh.

Paul Zahra
sumber