Visual Studio 2017 - tidak dapat memuat file atau rakitan 'System.Runtime, Version = 4.1.0.0' atau salah satu dependensinya

103

Saya menggunakan Visual Studio 2017 dan mencoba membuat pustaka .Net Standard 1.5 dan menggunakannya dalam proyek uji .Net 4.6.2 nUnit.

Saya mendapatkan kesalahan berikut ...

Tidak dapat memuat file atau rakitan 'System.Runtime, Version = 4.1.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' atau salah satu dependensinya. Sistem tidak dapat menemukan berkas yang dicari.

Saya telah mencoba yang berikut ini:

  1. Referensi perpustakaan Std sebagai referensi proyek. Kesalahan: memberi saya kesalahan sebelumnya.
  2. Buat pkg NuGet untuk perpustakaan Std saya dan rujuk itu. Kesalahan: Jenisnya adalah System.String, mengharapkan System.String. Ini karena System.Runtime akhirnya direferensikan oleh proyek dan memiliki definisi untuk semua tipe standar.
  3. Referensi NuGet pkg NetStandard.Library. Kesalahan: beri saya kesalahan yang sama dengan # ("Jenisnya adalah System.String, mengharapkan System.String"). CATATAN: Sebelum saya melakukan ini, saya menghapus SEMUA paket NuGet dari proyek dan kemudian menambahkan hanya paket nUnit dan NetStandard.Library (yang menginstal 45 paket lain).

Apakah ini bug? Apakah ada solusi? Bantuan apa pun dihargai.

Brian
sumber

Jawaban:

91

Saya memiliki masalah yang sama dan tidak ada solusi yang disarankan yang menurut saya berhasil. Solusi saya untuk masalah ini adalah: Periksa App.config dan packages.config untuk melihat apakah versinya cocok.

Awalnya app.config saya berisi:

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

Tetapi package.config berisi:

<package id="System.Runtime" version="4.3.0" targetFramework="net461" requireReinstallation="true" />

Saya mengubah entri app.config agar cocok dengan packages.config untuk newVersion:

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

Setelah perubahan, masalah teratasi.

Ty Petrice
sumber
Atau cukup tambahkan referensi ke web.config Anda: stackoverflow.com/a/38603514/1145177
Doug S
7
Saya menarik "4.3.0" dari NuGet tetapi untuk beberapa alasan VS bersikeras bahwa saya merujuk "4.1.2.0", pekerjaan serupa hanya dengan nomor versi yang berbeda berhasil untuk saya ...
David Rogers
Saya memiliki masalah yang sama seperti @DavidRogers dalam proyek MSTest. Mengonsolidasi perbedaan antara app.config dan packages.config menyelesaikan masalah.
Oktoat
ya terima kasih banyak ! Ini adalah solusi untuk MSTest saya tidak menemukan tes [MSTest][Discovery] Failed to discover tests from assembly Reason:Could not load file or assembly 'System.Reflection, Version=4.1.1.0 etc
Dan M
Solusi berhasil untuk saya. Masalah dimulai setelah menginstal HtmlAgilityPack NUGET. Dan tidak akan berjalan karena info versi yang salah dalam paket. +1
Roberto
35

Masalah ini terjadi saat Anda mereferensikan proyek .NET Standard dari proyek .NET 4.x: tidak ada referensi paket nuget proyek .NET Standard yang dibawa sebagai dependensi.

Untuk memperbaikinya, Anda perlu memastikan file csproj .NET 4.x Anda mengarah ke alat build saat ini (setidaknya 14):

<Project ToolsVersion="15.0">...

Di bawah ini seharusnya tidak lagi diperlukan, sudah diperbaiki sekitar VS 15.3:

Ada bug yang diketahui di VS2017, khususnya di NuGet 4.0.

Untuk mengatasi bug tersebut, Anda harus membuka file .csproj untuk proyek .NET 4.x Anda dan menambahkan cuplikan ini:

<ItemGroup>
  <PackageReference Include="Legacy2CPSWorkaround" Version="1.0.0">
    <PrivateAssets>All</PrivateAssets>
  </PackageReference>
</ItemGroup>

NuGet 4.x membawa serta "referensi paket" - tidak ada lagi paket.config - tetapi pipeline 4.x lama tidak diperbarui sepenuhnya pada saat peluncuran VS2017. Cuplikan di atas tampaknya "membangunkan" sistem build untuk menyertakan referensi paket dari dependensi dengan benar.

Cory Nelson
sumber
Pembaruan Visual Studio 17 mana? Bisakah Anda menentukan versinya?
Ronak Agrawal
11
Saya masih memiliki masalah di 15.5.5 VS2017. Sepertinya ada penyebab lain.
SerG
Pertanyaan: apakah proyek .NET 4.x Anda menggunakan referensi paket, atau masih menggunakan packages.config? Saya bertanya-tanya apakah alasan mengapa ini tampak diperbaiki bagi saya adalah karena saya telah menyingkirkan packages.config.
Cory Nelson
2
Perlu dicatat bahwa Visual Studio 2017 Versi 15.7 dan yang lebih baru mendukung migrasi proyek dari format manajemen packages.config ke format PackageReference. docs.microsoft.com/en-us/nuget/reference/…
tenang tarn
@tranquiltarn dari tautan Anda: "Migrasi saat ini tidak tersedia untuk proyek C ++ dan ASP.NET."
JP Hellemons
34

Saya mengalami masalah ini baru-baru ini dan saya mencoba banyak hal yang disebutkan di utas ini dan lainnya. Saya menambahkan referensi paket untuk "System.Runtime"oleh manajer paket nuget, memperbaiki perintah pengikatan app.config, dan memastikan bahwa app.configdan package.configmemiliki versi yang sama untuk perakitan. Namun, masalahnya tetap ada.

Akhirnya, saya menghapus <dependentAssembly>tag untuk perakitan dan masalah menghilang. Jadi, coba hapus yang berikut ini di app.config.

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

Sunting: Setelah saya memperbarui .NET framework ke 4.7.2, masalah muncul kembali. Saya mencoba trik di atas tetapi tidak berhasil. Setelah membuang waktu berjam-jam, saya menyadari masalahnya terjadi karena System.Linqreferensi lama di app.config. Oleh karena itu, hapus atau perbarui semua referensi Linq juga untuk menghilangkan masalah ini.

Tushar
sumber
4
Setiap kali saya mengalami masalah yang ditentukan oleh OP, saya menghapus informasi System.Runtime di file .config dan ini menyelesaikannya. Saya setuju dengan Anda bahwa ini adalah solusi valid yang potensial. Itu cenderung terjadi pada saya ketika saya menambahkan paket dari nuget.
Wallace B. McClure
Bekerja untuk saya. Saya mendapat kesalahan xunit System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime, Version=4.1.2.0setelah meningkatkan proyek saya ke 4.7.2
Anton Krouglov
Berdasarkan jawaban Anda, saya memeriksa paket nuget saya dan menemukan kebutuhan 'Google.protobuf' (Konsolidasi) antara proyek saya, thnx
Osama_Almaani
28

Percayalah, saya tidak bercanda. Hapus semua dependensi System.Runtime dari app.config Anda dan itu akan mulai berfungsi.

Sheena Agrawal
sumber
9
Penjelasan yang lebih baik tentang mengapa ini berhasil akan sangat membantu.
Dour High Arch
Masalah dengan metode ini adalah, setiap kali Anda memperbarui paket nuget apa pun atau menambahkan paket nuget baru, itu akan ditambahkan lagi.
Getar
16

Saya mengatasi kesalahan itu dengan mereferensikan NetStandard.Library dan File app.config berikut di NUnit-Project.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.1.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Edit

Jika ada selain System.Runtime, System.Reflectionatau System.Runtime.InteropServiceshilang (misalnya System.Linq), maka tambahkan saja dependentAssemblynode baru .

Edit 2

Dalam Versi Visual Studio baru (2017 15.8 saya pikir) mungkin Studio membuat File app.config. Cukup centang kotak centang Auto-generate binding redirects di Project-Properties - Application . Buat pengalihan binding secara otomatis

Edit 3

Pengalihan pengikatan yang dibuat secara otomatis tidak bekerja dengan baik dengan Perpustakaan Kelas .NET. Menambahkan baris berikut ke file csproj menyelesaikan ini dan file .config yang berfungsi untuk Classlibary akan dibuat.

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
Noffls
sumber
11
Anehnya, saya memperbaiki masalah saya dengan menghapus semua <dependentAssembly>node untuk System.Runtime ..
Matt Brewerton
@MattBrewerton sudah dikonfirmasi!
Bart De Boeck
13

Saya memperbaikinya dengan menghapus app.configdengan

<assemblyIdentity name="System.Runtime" ....> 

entri.

app.config ditambahkan secara otomatis (tetapi tidak diperlukan) selama pemfaktoran ulang

Marco
sumber
Ini berhasil untuk saya! Pasti coba ini jika semua item lain tidak berhasil untuk Anda
bOkeifus
3

Masalah ini terjadi saat Anda mereferensikan proyek .NET Standard dari proyek .NET 4.x: tidak ada referensi paket nuget proyek .NET Standard yang dibawa sebagai dependensi.

Saya menyelesaikannya dengan menambahkan 4.3paket System.Runtime dan NETStandard.Library dan !! penting !! Saya menggunakan alat refactor untuk mencari versi System.Runtime.dll, 4.1.1.1bukan 4.3dan kemudian menambahkan bindingRedirect di .config

<dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.1.1.1" />
</dependentAssembly>
bersinar
sumber
3

sudah terlambat saya tahu, namun tidak ada jawaban yang berhasil. Saya menemukan jawabannya dari situs web lain. Saya memperbaiki masalah ketika saya menghapus ketergantungan perakitan System.Runtime. Saya menghapus ini.

<dependentAssembly> <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/> </dependentAssembly>

Salam Hormat

Mesut erdoğan
sumber
2

Saya memiliki masalah dengan ini di proyek NUnit 2.6.4 yang menargetkan kerangka dotnet 4.6.2. Saya mengalami System.Runtime FileNotFoundkesalahan itu saat mencoba menggunakan Humanizer .

Saya memperbaiki kesalahan saya dengan menginstal NetStandard.Library ke dalam proyek pengujian unit saya.

nweinstein
sumber
2

Kami telah menemukan bahwa AutoGenerateBindingRedirectsmungkin menyebabkan masalah ini.

Teramati: penargetan proyek yang sama net45dan netstandard1.5berhasil dibangun di satu mesin dan gagal membangun di yang lain. Mesin memiliki versi berbeda dari kerangka kerja yang diinstal (4.6.1 - berhasil dan 4.7.1 - gagal). Setelah meningkatkan framework pada mesin pertama ke 4.7.1, build juga gagal.

Error Message:
 System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
  ----> System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

Auto binding redirectsadalah fitur dari .net 4.5.1. Setiap kali nuget mendeteksi bahwa proyek secara transitif mereferensikan versi yang berbeda dari rakitan yang sama, nuget akan secara otomatis menghasilkan file konfigurasi di direktori keluaran yang mengarahkan semua versi ke versi tertinggi yang diperlukan.

Dalam kasus kami, pengikatan ulang semua versi System.Runtimemenjadi Version=4.1.0.0. .net 4.7.1dikirimkan dengan 4.3.0.0versi runtime. Jadi, pengikatan pengalihan adalah pemetaan ke versi yang tidak tersedia dalam versi kerangka kerja kontemporer.

Masalahnya telah diperbaiki dengan menonaktifkan pengalihan pengikatan otomatis untuk target 4.5 dan membiarkannya hanya untuk inti .net.

<PropertyGroup Condition="'$(TargetFramework)' == 'net45'">
  <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
</PropertyGroup>
pengguna1921819
sumber
2

Masalah ini memiliki banyak penyebab ... dalam kasus saya masalahnya adalah yang ada di web saya.config tag menambahkan perakitan System.Runtime:

<assemblies>
    <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>

tetapi satu paket juga menambahkan perakitan yang sama sebagai ketergantungan dengan versi lain:

<package id="System.Runtime" version="4.3.0" targetFramework="net47" />

menghapus tag "tambahkan perakitan" dari web.config saya menyelesaikan masalah.

Silas Humberto Souza
sumber
2

Sepertinya masalah ini disebabkan ketika ada konflik versi antara packages.config dan app.config. Di app.config Anda memiliki pengalihan pengikatan assembly yang secara otomatis dihasilkan oleh hal yang disebut "AutoGenerateBindingRedirects". Ketika diaktifkan setiap kali Anda mengunduh paket nuget, itu akan, selain membuat entri baru di packages.config, menambahkan informasi pengalihan mengikat ini ke app.config, apa tujuannya dijelaskan di sini: Pengalihan Pengikatan Majelis: Bagaimana dan Mengapa?

Di sana Anda dapat membaca apa yang ditulis pengguna @Evk:

Mengapa pengalihan yang mengikat diperlukan? Misalkan Anda memiliki aplikasi A yang mereferensikan library B, dan juga library C versi 1.1.2.5. Library B pada gilirannya juga mereferensikan library C, tetapi dari versi 1.1.1.0. Sekarang kami mengalami konflik, karena Anda tidak dapat memuat versi berbeda dari rakitan yang sama saat runtime. Untuk menyelesaikan konflik ini, Anda mungkin menggunakan pengalihan binding, biasanya ke versi baru

Jadi, PERBAIKAN CEPAT: Hapus semua entri di app.config.

Dalam kasus saya, hanya dengan melakukan program itu mulai bekerja, tetapi mungkin hanya akan berfungsi jika Anda tidak memiliki konflik versi dari rakitan yang sama saat runtime.

Jika Anda memiliki konflik seperti itu, Anda harus memperbaiki nomor versi ini di app.config agar sesuai dengan versi rakitan yang benar-benar digunakan, tetapi proses manual itu menyakitkan, jadi saya sarankan untuk membuatnya secara otomatis lagi dengan membuka Konsol Pengelola Paket dan melakukan penginstalan ulang paket dengan mengetik Update-Package -reinstall

psychoboi111
sumber
1

Saya berakhir dalam situasi ini beberapa kali dengan situs web .NET 4.6.1 saya. Saya membuat masalah setiap kali saya menambahkan referensi ke proyek .NET Core terpisah. Setelah membangun, Visual Studio dengan benar memberitahu saya bahwa referensi lintas kerangka tersebut tidak valid, dan saya segera menghapus referensi proyek tersebut. Proyek dibangun dengan baik setelah itu, tetapi kesalahan System.Runtime muncul saat mengakses situs web dan menolak untuk pergi.

Perbaikannya setiap kali timpang tetapi efektif: Saya menghapus direktori proyek dan mengunduhnya kembali dari kontrol sumber. Meskipun tidak ada perbedaan antara sebelum dan sesudah, saya dapat membangun proyek dan mengakses halaman tanpa keluhan.

spamguy
sumber
1

Mengalami ini sekarang di proyek Unit Test setelah menambahkan MsTest V2 melalui Nuget. Mengganti nama app.config (menghapusnya dengan sangat efektif) berhasil bagi saya.

Setelah membaca semua posting di atas, saya masih tidak yakin mengapa, maaf!

jgmdavies.dll
sumber
1

Saya memperbaiki masalah dengan menghapus Paket Nuget System.Runtimedan menginstalnya kembali

Darren Wood
sumber
1

Ke app.config atau web.config tambahkan

<dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
Michele Bortot
sumber
1

Saya punya proyek dengan masalah yang sama, saya menyelesaikannya dengan mengubah versi inti dotnet dari 2.2 ke 2.0, Jika masalah Anda tetap ada, Coba solusi ini

keivan kashani
sumber
1

Sebelum menjalankan pengujian unit, hapus saja tag runtime dari file app.config. Masalah akan terpecahkan.

Sameer Sayani
sumber
0

Saya memiliki masalah serupa di VS 2017 15.45 - Saya menemukan ketika saya memeriksa bahwa meskipun proyek dikompilasi dan menjalankannya muncul dengan system.IO.FileNotFoundException berkenaan dengan System.Runtime ketika saya mencoba mengakses objek TPL Dataflow.

Ketika saya memeriksa proyek dalam solusi, salah satunya (yang teratas) tidak memiliki paket System.Runtime yang digunakan oleh proyek yang mendasarinya. Setelah saya menginstalnya dari Nuget, semuanya bekerja dengan benar.

Liam
sumber
0

Saya mencoba semua solusi di sini, tetapi tidak berhasil. Akhirnya, saya menyelesaikannya dengan membuka file csproj baru dan secara manual menambahkan bagian berikut:

<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
</Reference>
Mike Chamberlain
sumber
0

Saya menggunakan ASP.Net CORE 2.1 dan saya mendapatkan kesalahan ini ketika saya menjalankan dengan memilih .csproj dari daftar sekitar 40 di repo besar. Ketika saya membuka file csproj satu per satu, kesalahan telah teratasi. Sesuatu dengan bagaimana program diluncurkan berbeda ketika csproj dibuka.

pengguna5389726598465
sumber
0

Saya mengatasi masalah ini dengan beralih dari .NET 4.7.2 => .NET 4.5.2 dan kemudian beralih kembali ke 472. Jadi dalam beberapa kasus, kesalahan ini terjadi karena manajer paket tidak dapat menyelesaikan ketergantungan

Олег Железцов
sumber
0

Jika sebelumnya berfungsi, maka harus ada perubahan App.config. Urungkan App.config berhasil untuk saya.

Damitha
sumber
0

Saya juga telah melalui kesalahan ini dan membagikan bagaimana saya menyingkirkannya.

Dalam kasus saya, baris di bawah ini ada di web.config dari proyek webapi tetapi tidak ada referensi paket di file package.config.

Kode di Web.config di Proyek Webapi

<dependentAssembly>
    <assemblyIdentity name="System.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.3.0" />
</dependentAssembly>

Kode I Ditambahkan dalam file packages.config dalam proyek api web Sebelum menutup elemen.

<package id="System.Runtime" version="4.3.0" targetFramework="net461" />

Solusi Lain Berhasil dalam Kasus Saya:

Tentu singkat lain yang dapat berfungsi jika Anda menyalin proyek ke sistem Komputer lain yang mungkin memiliki versi paket yang sedikit berbeda sehingga Anda dapat mencoba mengubah versi rakitan ke versi yang diberikan dalam kesalahan di situs web / webapi saat Anda menjalankannya. Seperti dalam kasus ini seperti yang diberikan dalam pertanyaan Versi yang dibutuhkan adalah '4.1.0.0' jadi cukup coba ubah versi saat ini di web.config ke versi yang ditunjukkan dalam kesalahan seperti di bawah ini

Kesalahan:

Could not load file or assembly 'System.Runtime, Version=4.1.0.0' or one of its dependencies

Versi Ganti

Heemanshu Bhalla
sumber
0

Saya mengalami kesalahan ini ketika membangun Fungsi Azure (dengan pemicu antrian, jika itu membuat perbedaan)

Masalah dalam kasus ini adalah karena AzureFunctionsVersiondisetel ke v2, bukan v3. Untuk memperbaruinya melalui VS2019, keluarkan proyek lalu edit file csproj. Di dalam PropertyGroupnode, tambahkan / edit berikut ini:

<PropertyGroup>
  <AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
Rory McCrossan
sumber