Anda harus menambahkan referensi ke assembly 'netstandard, Version = 2.0.0.0

124

Proyek ini adalah Aplikasi Web ASP.NET MVC yang menargetkan .NET Framework 4.6.1.

Tiba-tiba (beberapa paket NuGet ditingkatkan) saya mulai mendapatkan kesalahan berikut selama runtime:

CS0012: Jenis 'System.Object' ditentukan dalam rakitan yang tidak dirujuk. Anda harus menambahkan referensi ke assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'.

Dalam pandangan utama saya Index.cshtml, dalam garis yang saya manfaatkan@Html.ActionLink

Saya memiliki .NET Core SDK 2.0 dan .NET Framework 4.7.1 diinstal di mesin saya, tetapi saya tidak ingin menyertakan referensi untuk itu. Ini adalah aplikasi web .NET Framework saja, dihosting di Windows IIS di mana kerangka kerja yang diinstal adalah 4.6.1, tidak ada NET Core yang diinstal di server.

Jadi mengapa meminta untuk menambahkan referensi netstandard? Bagaimana saya dapat memperbaikinya tanpa referensi netstandardtetapi menggunakan Windows .NET Framework 4.6.1 lengkap?

Saya telah memeriksa komit sebelumnya yang berfungsi dengan baik dan saya masih mendapatkan kesalahan ini. Jadi ini tidak terkait dengan paket NuGet yang ditingkatkan. Sepertinya ada sesuatu di mesin dev lokal saya.

Jika mempublikasikan aplikasi ke direktori dan menjalankannya dengan IIS, ini berfungsi.

Tautan ke .csproj gist

package.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.5.0.2" targetFramework="net46" />
  <package id="BundleTransformer.Core" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Handlebars" version="1.9.73" targetFramework="net46" />
  <package id="BundleTransformer.Less" version="1.9.69" targetFramework="net46" />
  <package id="BundleTransformer.Yui" version="1.9.52" targetFramework="net46" />
  <package id="Dapper" version="1.42" targetFramework="net46" />
  <package id="EcmaScript.Net" version="1.0.1.0" targetFramework="net46" />
  <package id="EntityFramework" version="6.0.0" targetFramework="net46" />
  <package id="Glimpse" version="1.8.6" targetFramework="net46" />
  <package id="Glimpse.AspNet" version="1.9.2" targetFramework="net46" />
  <package id="Glimpse.Mvc5" version="1.5.3" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.Core" version="1.2.4" targetFramework="net46" />
  <package id="JavaScriptEngineSwitcher.V8" version="1.3.0" targetFramework="net46" />
  <package id="jQuery" version="2.1.3" targetFramework="net46" />
  <package id="jQuery.Validation" version="1.13.1" targetFramework="net46" />
  <package id="LowercaseDashedRoute" version="1.0.14" targetFramework="net46" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net46" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
  <package id="Moment.js" version="2.10.2" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="10.0.3" targetFramework="net46" />
  <package id="NWebsec" version="5.1.1" targetFramework="net46" />
  <package id="NWebsec.Core" version="2.1.0" targetFramework="net46" />
  <package id="NWebsec.Mvc" version="5.1.1" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="Respond" version="1.4.2" targetFramework="net46" />
  <package id="Sendgrid" version="6.3.0" targetFramework="net46" />
  <package id="SendGrid.SmtpApi" version="1.3.1" targetFramework="net46" />
  <package id="Serilog" version="2.6.0" targetFramework="net46" />
  <package id="Serilog.Enrichers.Environment" version="2.1.2" targetFramework="net46" />
  <package id="Serilog.Sinks.File" version="3.2.0" targetFramework="net46" />
  <package id="Serilog.Sinks.RollingFile" version="3.3.0" targetFramework="net46" />
  <package id="Serilog.Sinks.Sentry" version="2.1.4" targetFramework="net46" />
  <package id="SerilogWeb.Classic" version="2.1.17" targetFramework="net46" />
  <package id="SharpRaven" version="2.2.0" targetFramework="net46" />
  <package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.EF6" version="1.0.108.0" targetFramework="net46" />
  <package id="System.Data.SQLite.Linq" version="1.0.108.0" targetFramework="net46" />
  <package id="Twitter.Bootstrap.Less" version="3.3.4" targetFramework="net46" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net46" />
  <package id="WebGrease" version="1.6.0" targetFramework="net46" />
  <package id="YUICompressor.NET" version="2.7.0.0" targetFramework="net46" />
</packages>

Saat menerbitkan aplikasi menggunakan VS2017 ke sistem file, saya mendapatkan peringatan berikut di output:

Rakitan berikut memiliki ketergantungan pada versi .NET Framework yang lebih tinggi dari target dan mungkin tidak memuat dengan benar selama runtime yang menyebabkan kegagalan: netstandard, Versi = 2.0.0.0, Budaya = netral, PublicKeyToken = cc7b13ffcd2ddd51. Ketergantungan tersebut adalah: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Anda harus memastikan bahwa rakitan dependen benar untuk kerangka kerja target, atau memastikan bahwa kerangka kerja target yang Anda tangani adalah rakitan dependen.

Tetapi saya tidak dapat menemukan apa pun System.Transactions. Bagaimana saya bisa mencari apa yang mereferensikannya?

emzero
sumber
1
Paket NuGet apa yang Anda gunakan? Apakah Anda yakin Anda tidak mereferensikan ASP.NET Core?
Ricardo Peres
@RicardoPeres VS2017 tidak mengizinkan Anda menambahkan paket yang menargetkan kerangka kerja berbeda dari yang ditargetkan proyek. Saya telah menghapus dan menginstal ulang semua paket tetapi kesalahannya sama. Saya tidak mengerti mengapa itu terjadi dan bahkan mengapa selama runtime ...
emzero
2
The System.Data.SQLite.Corepaket didasarkan pada NET Inti (atau NET Standar, aku tidak pergi mencari sumber atau docs). Lihat pesan kesalahan di bagian paling akhir file proyek Anda.
McGuireV10
Mengapa Anda mengatakan didasarkan pada .NET Core? Saya melihat packages\System.Data.SQLite.Core.1.0.108.0\libdirektori dan itu berisi folder untuk setiap versi .NET Framework, termasuk 4.6 yang saya gunakan. Saya tidak berpikir itu masalahnya di sini.
emzero
2
Ketika saya menghadapi masalah yang tidak dapat diselesaikan seperti ini, yang saya lakukan adalah 1) dengan hati-hati perhatikan apa referensi proyek (atau simpan .csproj di suatu tempat), 2) hapus file packages.config, hapus semua referensi eksternal (alternatifnya Anda dapat menulis proyek baru dari awal hanya dengan file statis asli, .cs, dll.), 3) konfigurasikan VS Nuget untuk menggunakan Referensi Paket daripada paket legagy. mode config docs.microsoft.com/en-us/nuget/reference/… dan 4) tambahkan kembali semua referensi yang dibutuhkan. Sebagian besar waktu, itu berhasil dan saya tidak tahu mengapa itu gagal sebelumnya.
Simon Mourier

Jawaban:

181

Saya pikir solusinya mungkin masalah ini di GitHub :

Coba tambahkan referensi netstandard di web.config seperti ini: "

<system.web>
  <compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
  <httpRuntime targetFramework="4.7.1" />

Saya menyadari Anda menggunakan 4.6.1 tetapi pilihan .NET 4.7.1 penting karena versi Framework yang lebih lama tidak sepenuhnya kompatibel dengan .NET Standard 2.0.

Saya tahu ini dari pengalaman yang menyakitkan, ketika saya memperkenalkan pustaka .NET Standard saya memiliki banyak masalah dengan paket NUGET dan referensi yang rusak. Perubahan lain yang perlu Anda pertimbangkan adalah mengupgrade ke PackageReferences, bukan package.configfile.

Lihat panduan ini dan Anda mungkin juga menginginkan alat untuk membantu peningkatan . Itu memang membutuhkan versi VS 15.7 yang terlambat.

Quango
sumber
2
Saya pikir siapa pun yang tiba di sini juga harus melihat panduan yang sangat baik tentang penulisan libs open source oleh penulis Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - khususnya "Hindari termasuk target "netstandard1.x", dan menggunakan .NET 4.7.2 sebagai versi nyata terendah yang mendukung .netstandard 2.0
Quango
Persis apa yang dibutuhkan saat ditingkatkan ke v4.7.2 (aplikasi non inti) dan mendapat pengecualian seperti berikut: "Jenis 'DateTime' ditentukan dalam rakitan yang tidak direferensikan. Anda harus menambahkan referensi ke standar jaringan rakitan, Versi = 2.0.0.0, Budaya = netral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted
Apakah ini juga harus ditambahkan ke referensi di file csproj, atau hanya diperlukan di web.config?
petrosmm
1
Jawaban yang bagus. Terima kasih. Saya sedang dalam proses mengupgrade paket utilitas lama dan menerapkan standar baru 2.0 sebagai gantinya. Aplikasi web ini khususnya memiliki masalah karena <add assembly="netstandardtidak ada dan httpRuntime bukan 4.7.1- Ini jawabannya! Terima kasih !!
Piotr Kula
Dalam kasus kami, kami memiliki beberapa rakitan 2.0 standar yang digunakan oleh proyek ASP.Net 4.7.2 tetapi kami menambahkan beberapa JsonConverter dari namespace System.Text.Json.Serialization ke salah satu proyek 2.0 standar dan itu menyebabkan kesalahan ini. Solusi ini menyelesaikan masalah kami.
ShaneH
35

Mengedit file .csproj secara manual dan menambahkan referensi di bawah berfungsi untuk saya.

<Reference Include="netstandard" />

Terima kasih kepada Fahad Alshaya yang menyarankannya di sini .

kamilk
sumber
Di mana ini harus diletakkan di dalam file proyek? Di dalam "tag" lainnya yang mana?
Ulysses Alves
1
@UlyssesAlves Di suatu tempat di samping tag Referensi lain
kamilk
@kamilk "di suatu tempat di sebelah yang lain" tidak terlalu akurat. Yah, saya melihat beberapa proyek lain, tetapi sayangnya ini tidak berhasil untuk saya dan saya telah memutuskan untuk mengatasi masalah ini dari perspektif lain, yang tidak melibatkan perubahan versi .net dari proyek tersebut.
Ulysses Alves
1
Yang ini berhasil untuk saya, saya juga harus menginstal NetStandard.Library melalui NuGet.
David Acero
Hal-hal kecil yang "membuatmu" ... Jawaban yang bagus.
Benj Sanders
15

Saya harus melakukan kombinasi jawaban orang lain di utas ini.

  1. Instal NetStandard.Library melalui NuGet
  2. Mengedit file .csproj secara manual dan menambahkan referensi. <Reference Include="netstandard" />
  3. Memperluas proyek -> Referensi di VS Solution Explorer, klik kanan pada 'netstandard' dan tampilkan halaman properti dan setel "Salin Lokal" ke true.
Damien Sawyer
sumber
3
Menyetel 'Salin lokal' berhasil untuk saya.
FrenkyB
1
Solusi ini bekerja dengan sempurna, ditambah proyek tidak bergantung pada kompilasi dalam mode debug.
DarkHawk
6

Saya telah mengalami ini sebelumnya dan mencoba beberapa hal telah memperbaikinya untuk saya:

  • Hapus folder bin jika ada
  • Hapus folder .vs yang tersembunyi
  • Pastikan paket penargetan 4.6.1 diinstal
  • Upaya Terakhir Ditch: Tambahkan referensi ke System.Runtime (proyek klik kanan -> tambahkan -> referensi -> centang kotak di sebelah System.Runtime), meskipun saya pikir saya selalu menemukan salah satu hal di atas telah menyelesaikannya sebagai gantinya melakukan ini.

Selain itu, jika ini adalah aplikasi inti .net yang berjalan pada kerangka kerja lengkap, saya mendapati Anda harus menyertakan file global.json di root proyek Anda dan mengarahkannya ke SDK yang ingin Anda gunakan untuk proyek itu:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}
Kyle Dodge
sumber
2
Sudah mencoba semuanya, tidak berhasil. Ini bukan proyek .NET Core seperti yang saya katakan. Ini adalah .NETFramework 4.6.1 normal.
emzero
Tutup VS, hapus bin, hapus .vs - saya senang.
Reed Shilts
5

Menghapus folder Bin dan Obj berhasil untuk saya.

Vijay Verma
sumber
5

Setelah memutakhirkan dari kerangka 4.6.1 ke 4.7.2 kami mulai mendapatkan kesalahan ini:

"Jenis 'System.Object' ditentukan dalam rakitan yang tidak direferensikan. Anda harus menambahkan referensi ke rakitan 'netstandard, Versi = 2.0.0.0, Budaya = netral, PublicKeyToken = cc7b13ffcd2ddd51'." dan akhirnya solusinya adalah menambahkan referensi perakitan "standar bersih" yang disebutkan di atas:

<compilation debug="true" targetFramework="4.7.1" >
    <assemblies>
      <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
            PublicKeyToken=cc7b13ffcd2ddd51"/>
    </assemblies>
  </compilation>
Raghav
sumber
1
Ini bekerja. Hal lain yang berfungsi (tanpa perubahan ini) adalah menambahkan <Reference Include="netstandard" />ke file csproj, TAPI ... itu hanya berfungsi jika Anda JUGA mengatur CopyLocal ke true. Semua ini tidak masuk akal.
Triynko
1

Meskipun ini adalah utas lama, saya memiliki masalah yang sama hari ini, minggu lalu saya memperbarui beberapa paket NuGet dan meskipun situs web MVC berfungsi dengan baik pada mesin dev saya ketika saya menerbitkan ke server pengujian, gagal.

Saya membaca banyak posting tetapi tidak ada yang berhasil. Saya akhirnya membandingkan DLL di bin lokal saya dengan yang ada di server pengujian dan menemukan bahwa netstandard.dll tidak diunggah, setelah diunggah, situs web berfungsi dengan baik, tidak yakin mengapa penyebaran web VS2017 tidak menerbitkan DLL.

Hanya sesuatu yang harus diwaspadai jika tidak ada yang berhasil untuk Anda.

George Phillipson
sumber
1

Saya mengalami ini saat memutakhirkan .NET Core 1.1 ke 2.1.

Saya mengikuti instruksi yang diuraikan di sini .

Cobalah untuk menghapus <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>atau <NetStandardImplicitPackageVersion>bagian di .csproj.

h-rai
sumber
1

Kami mulai mendapatkan kesalahan ini di server produksi setelah menerapkan aplikasi yang bermigrasi dari 4.6.1 ke 4.7.2.

Kami melihat bahwa .NET framework 4.7.2 tidak diinstal di sana. Untuk mengatasi masalah ini kami melakukan langkah-langkah berikut:

  1. Menginstal .NET Framework 4.7.2 dari:

    https://support.microsoft.com/en-us/help/4054530/microsoft-net-framework-4-7-2-offline-installer-for-windows

  2. Nyalakan ulang mesin

  3. Mengonfirmasi versi .NET Framework dengan bantuan Bagaimana cara menemukan versi .NET?

Menjalankan aplikasi lagi dengan versi .Net Framework 4.7.2 yang diinstal pada mesin memperbaiki masalah.

Raghav
sumber
1

Saya menghadapi Masalah yang sama yang saya lakukan mengikuti Setup Sekarang Aplikasi Bekerja dengan baik

1-

<compilation debug="true" targetFramework="4.7.1">
      <assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, 
      PublicKeyToken=cc7b13ffcd2ddd51"/>
      </assemblies>
    </compilation>

2- Tambahkan Referensi

 **C:\Program Files (x86)\Microsoft Visual
Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\ADL
 Tools\2.4.0000.0\ASALocalRun\netstandard.dll**

3-

Copy Above Path Dll to Application Bin Folder on web server

Mansoor
sumber
Dimana ini didokumentasikan? Bagaimana setiap orang bisa menebak untuk meletakkan baris ini di file web.config? Kebetulan, yang bekerja sama baiknya adalah menambahkan baris ke csproj yang mereferensikan "netstandard", dan menyetel CopyLocal ke true. Meski begitu, itu bahkan tidak terdaftar sebagai referensi yang mungkin dalam dialog referensi di mana pun, jadi satu-satunya cara untuk mendapatkannya adalah dengan menambahkannya secara manual. Ini gila. Dan saya menargetkan .NET 4.7.2, yang seharusnya sepenuhnya kompatibel dengan standar .NET, namun saya harus melakukan langkah-langkah tidak jelas ini untuk membuatnya berfungsi.
Triynko
0

Mungkin harus dilakukan dengan salah satu dari ini:

  1. Instal SDK yang lebih baru.
  2. Dalam .csproj, periksa Reference Include = "netstandard"
  3. Periksa versi rakitan dalam tag kompilasi di Views \ Web.config dan Web.config.
ivw
sumber
ok semoga kita hampir sampai. "Saya menambahkan referensi ke NETStandard.Library alih-alih NETStandard.Library.NETFramework" periksa posting ini: github.com/dotnet/standard/issues/391
ivw
Biasanya System.Transactions bukan bagian dari referensi Anda, coba tambahkan dalam referensi Anda dengan cara: klik kanan pada referensi Anda jika Anda menggunakan Aplikasi Web atau dalam Proyek Anda jika Anda menggunakan Situs Web. temukan System.Transactions di referensi .NET. Anda harus menemukan System.Transactions di referensi Anda.
ivw
0

masukkan deskripsi gambar di sini Setel Salin Enbale ke true di properti netstandard.dll.

Buka Solution Explorer dan klik kanan pada netstandard.dll. Setel Salin Lokal ke true.

hani abukhurma
sumber
0

Saya menghadapi masalah ini ketika mencoba menambahkan ketergantungan .NETStandard ke pustaka .NET4.6.1, dan mengkompilasinya di Linux dengan Mono 4.6.2 (versi yang disertakan dengan Ubuntu 16.04).

Saya akhirnya menyelesaikannya hari ini; solusinya perlu melakukan kedua hal ini:

  1. Ubah <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>ke <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>dalam file .csproj.
  2. Tingkatkan mono Anda ke versi yang lebih baru. Saya yakin 5.x seharusnya berfungsi, tetapi untuk memastikan, Anda cukup menginstal Ubuntu 20.04 (yang pada saat penulisan ini hanya dalam pratinjau), yang mencakup Mono 6.8.0.105.
knocte
sumber
0

Anda dapat menambahkan ke web.config Anda di proyek Anda.

Ini tidak akan berfungsi ketika Anda menambahkannya ke proyek web.config karena berfungsi dengan MVC.

MEO
sumber
0

Dalam kasus saya, saya menemukan bahwa nuget yang bermasalah adalah System.Memory di versi 4.5.1. ketika diperbarui ke versi 4.5.3 itu berfungsi !!

bk
sumber
0

Mereka yang tidak memiliki file web.config. Jenis Keluaran selain aplikasi web. perbarui file proyek (.csproj) dengan kode beri di bawah ini.

Ini dapat menyebabkan karena menambahkan / menghapus .netframework dengan cara yang tidak benar atau mungkin rusak secara tidak terduga.

  <ItemGroup>
    <Reference Include="netstandard" />
  </ItemGroup>

Jenis Keluaran

  • Aplikasi konsol
  • Perpustakaan Kelas
Thiya
sumber
-5

Masalah ini didasarkan pada versi studio visual dan Windows yang Anda instal, Anda dapat mengikuti langkah-langkah berikut: -

  1. Buka Jendela Perintah
  2. menurunkan PCL Anda dengan perintah berikut

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Bangun Kembali Proyek Anda.
  4. Sekarang Anda akan dapat melihat keluaran yang diperlukan
Rakendu Shukla
sumber