'Netstandard, Sürüm = 2.0.0.0 derlemesine bir başvuru eklemelisiniz


124

Proje, .NET Framework 4.6.1'i hedefleyen bir ASP.NET MVC Web Uygulamasıdır.

Birdenbire (bazı NuGet paketleri yükseltildi) Çalışma zamanı sırasında aşağıdaki hatayı almaya başladım:

CS0012: 'System.Object' türü, başvurulmayan bir derlemede tanımlandı. 'Netstandard, Sürüm = 2.0.0.0, Kültür = nötr, PublicKeyToken = cc7b13ffcd2ddd51' derlemesine bir başvuru eklemeniz gerekir.

Ana görüşümde Index.cshtml, kullandığım bir çizgide@Html.ActionLink

Makinemde .NET Core SDK 2.0 ve .NET Framework 4.7.1 yüklü ama buna bir referans eklemek istemiyorum. Bu yalnızca bir .NET Framework web uygulamasıdır, yüklü çerçevenin 4.6.1 olduğu Windows IIS'de barındırılır, sunucuda yüklü NET Core yoktur.

Öyleyse neden bir referans eklemek istiyor netstandard? netstandardTam Windows .NET Framework 4.6.1'e başvurmadan nasıl düzeltebilirim ?

İyi çalışan önceki bir işlemi kontrol ettim ve hala bu hatayı alıyorum. Bu nedenle, NuGet paketlerinin yükseltilmesiyle ilgili değildir. Yerel geliştirme makinemde bir şey gibi görünüyor.

Bir uygulamayı bir dizinde yayınlar ve IIS ile çalıştırırsa çalışır.

.Csproj özüne bağlantı

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

Uygulamayı VS2017 kullanarak dosya sistemine yayınlarken çıktıda şu uyarıyı alıyorum:

Aşağıdaki derlemenin, hedeften daha yüksek bir .NET Framework sürümüne bağımlılıkları vardır ve çalışma zamanı sırasında hataya neden olacak şekilde doğru yüklenmeyebilir: netstandard, Sürüm = 2.0.0.0, Culture = nötr, PublicKeyToken = cc7b13ffcd2ddd51. Bağımlılıklar şunlardır: System.Transactions, Version = 4.0.0.0, Culture = nötr, PublicKeyToken = b77a5c561934e089. Ya bağımlı derlemenin hedef çerçeve için doğru olduğundan ya da ele aldığınız hedef çerçevenin bağımlı derlemeninki olduğundan emin olmalısınız.

Ama üzerinde hiçbir şey bulamıyorum System.Transactions. Onu referans alan şeyi nasıl arayabilirim?


1
Hangi NuGet paketlerini kullanıyorsunuz? Bir ASP.NET Core birine başvurmadığınızdan emin misiniz?
Ricardo Peres

@RicardoPeres VS2017, projenin hedeflediğinden farklı bir çerçeveyi hedefleyen bir paket eklemenize izin vermez. Tüm paketleri kaldırdım ve yeniden yükledim ancak hata aynı. Neden olduğunu ve çalışma sırasında neden olduğunu anlamıyorum ...
emzero

2
System.Data.SQLite.CorePaketi, .NET Çekirdek dayanır (veya .NET Standard, ben kaynak veya dokümanlar arayan gitmedi). Proje dosyanızın en sonundaki hata mesajına bakın.
McGuireV10

Neden .NET Core'a dayandığını söylüyorsunuz? packages\System.Data.SQLite.Core.1.0.108.0\libDizine bakıyorum ve içinde kullandığım 4.6 da dahil olmak üzere .NET Framework'ün her sürümü için bir klasör var. Buradaki sorunun bu olduğunu sanmıyorum.
emzero

2
Bunun gibi çözülemeyen sorunlarla karşılaştığımda, yaptığım şey 1) projenin referansının ne olduğunu dikkatlice not almak (veya .csproj'u bir yere kaydetmek), 2) packages.config dosyasını kaldırmak, tüm harici referansları kaldırmak (alternatif olarak yeni bir proje yazabilirsiniz) sıfırdan yalnızca orijinal statik dosyalar, .cs, vb. ile), 3) VS Nuget'i eski paketler yerine Paket Referansını kullanacak şekilde yapılandırın. config modu docs.microsoft.com/en-us/nuget/reference/… ve 4) gerekli tüm referansları geri ekleyin. Çoğu zaman işe yarıyor ve daha önce neden başarısız olduğuna dair hiçbir fikrim yok.
Simon Mourier

Yanıtlar:


182

Bence çözüm GitHub'da şu sorun olabilir :

Web.config dosyasına şu şekilde netstandard referansı eklemeyi deneyin: "

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

4.6.1 kullandığınızın farkındayım, ancak eski Framework sürümleri .NET Standard 2.0 ile tam olarak uyumlu olmadığından, .NET 4.7.1 seçimi önemlidir.

Bunu acı verici deneyimlerden biliyorum, .NET Standard kitaplıklarını tanıttığımda NUGET paketleri ve kırılan referanslarla ilgili birçok sorun yaşadım. Dikkate almanız gereken diğer değişiklik , dosyalar yerine PackageReferences'a yükseltmektir package.config.

Bu kılavuza bakın ve ayrıca yükseltmeye yardımcı olacak bir araç isteyebilirsiniz . Yine de geç bir VS 15.7 sürümü gerektirir.


2
Sanırım buraya gelen herkes, Newtonsoft.JSON'un yazarının açık kaynak kitaplarının yazılmasına ilişkin bu mükemmel kılavuza da bakmalıdır: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - özellikle "Kaçın netstandard1.x "hedefi dahil ve .NET 4.7.2'yi .netstandard 2.0'ı destekleyen en düşük gerçek sürüm olarak kullanın
Quango

Tam olarak v4.7.2'ye (çekirdek olmayan uygulama) yükseltildiğinde gerekli olan ve aşağıdaki gibi bir istisna oluştu: "'DateTime' türü referans verilmeyen bir derlemede tanımlandı. 'Netstandard, Sürüm' derlemesine bir başvuru eklemelisiniz = 2.0.0.0, Culture = nötr, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted

Bunun csproj dosyasındaki referanslara da eklenmesi gerekiyor mu yoksa sadece web.config dosyasında mı gerekli?
petrosmm

1
Mükemmel cevap. Teşekkürler. Eski bir yardımcı program paketini yükseltme sürecindeydim ve onun yerine yeni bir standart 2.0 yerleştirdim. Özellikle bu web uygulamasında sorunlar vardı çünkü <add assembly="netstandardeksikti ve ayrıca httpRuntime 4.7.1- Cevap bu! Teşekkürler !!
Piotr Kula

Bizim durumumuzda bir 4.7.2 ASP.Net projesi tarafından kullanılan birkaç standart 2.0 derlememiz vardı, ancak System.Text.Json.Serialization ad alanından standart 2.0 projelerinden birine bazı JsonConverter ekledik ve bu da bu hataya neden oldu. Bu çözüm sorunumuzu çözdü.
ShaneH

35

.Csproj dosyasını manuel olarak düzenlemek ve aşağıdaki referansı eklemek benim için çalıştı.

<Reference Include="netstandard" />

Bunu burada öneren Fahad Alshaya'ya teşekkür ederim .


Bu, proje dosyasında nereye konulmalıdır? Hangi diğer "etiketin" içinde?
Ulysses Alves

1
@UlyssesAlves Somewhere next to other Reference tags
kamilk

@kamilk "başka birinin yanında bir yer" pek doğru değil. Diğer bazı projelere baktım, ama ne yazık ki bu benim için işe yaramadı ve bu soruna, projenin .net sürümünü değiştirmeyi içermeyen başka bir bakış açısıyla yaklaşmaya karar verdim.
Ulysses Alves

1
Bu benim için çalıştı, ayrıca NetStandard.Library'yi NuGet aracılığıyla yüklemem gerekiyordu.
David Acero

"Seni anlayan" küçük şeyler ... Harika cevap.
Benj Sanders

15

Bu konudaki diğer insanların cevaplarının bir kombinasyonunu yapmak zorunda kaldım.

  1. NetStandard.Library'yi NuGet aracılığıyla yükleyin
  2. .Csproj dosyasını manuel olarak düzenleme ve referansı ekleme. <Reference Include="netstandard" />
  3. VS Solution Explorer'da proje -> Referanslar'ı genişletme, 'netstandard'a sağ tıklayıp özellikler sayfasını gösterme ve "Yerel Kopyala" seçeneğini true olarak ayarlama.

3
'Yerel kopyala' ayarı benim için yaptı.
FrenkyB

1
Bu çözüm mükemmel çalışır, ayrıca proje hata ayıklama modunda derlemeye bağlı değildir.
darkhawk

6

Bununla daha önce karşılaştım ve birkaç şeyi denemek benim için sorunu çözdü:

  • Varsa bir çöp kutusu klasörünü silin
  • Gizli .vs klasörünü silin
  • 4.6.1 hedefleme paketinin kurulu olduğundan emin olun
  • Last Ditch Effort: System.Runtime'a bir referans ekleyin (sağ tıklama proje -> ekle -> referans -> System.Runtime'ın yanındaki kutuyu işaretleyin), bunun yerine yukarıdakilerden birinin her zaman çözdüğünü düşünüyorum. bunu yapmaktan.

Ayrıca, bu tam çerçevede çalışan bir .net çekirdek uygulamasıysa , projenizin köküne bir global.json dosyası eklemeniz ve bu proje için kullanmak istediğiniz SDK'ya yönlendirmeniz gerektiğini fark ettim:

{
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

2
Hepsini denedim, şans yok. Dediğim gibi bu bir .NET Core projesi değil. Bu normal bir .NET Framework 4.6.1'dir.
emzero

VS'yi kapatın, bölmeyi silin, .vs'yi silin - mutluyum.
Reed Shilts


5

4.6.1 çerçevesinden 4.7.2'ye yükselttikten sonra şu hatayı almaya başladık:

"'System.Object' türü, başvurulmayan bir derlemede tanımlandı. 'Netstandard, Sürüm = 2.0.0.0, Culture = nötr, PublicKeyToken = cc7b13ffcd2ddd51' derlemesine bir başvuru eklemelisiniz." ve nihayetinde çözüm, yukarıda bahsedilen "netstandard" derleme referansını eklemekti:

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

1
Bu çalışıyor. <Reference Include="netstandard" />İşe yarayan başka bir şey (bu değişiklik olmadan) csproj dosyasına eklemektir, ANCAK ... sadece CopyLocal'ı true olarak ayarlarsanız çalışır. Bunların hiçbiri mantıklı değil.
Triynko

1

Bu eski bir iş parçacığı olmasına rağmen, bugün aynı sorunu yaşadım, geçen hafta bazı NuGet paketlerini güncelledim ve MVC web sitesi, test sunucusuna yayınladığımda dev makinemde sorunsuz çalışsa da başarısız oldu.

Çok sayıda yazı okudum ama hiçbiri işe yaramadı. Sonunda yerel bölmemdeki DLL'leri test sunucusundakilerle karşılaştırdım ve netstandard.dll'nin yüklenmediğini, web sitesi yüklendikten sonra düzgün çalıştığını gördüm, VS2017 web dağıtımının DLL'yi neden yayınlamadığından emin değilim.

Yukarıdakilerin hiçbiri sizin için işe yaramazsa, dikkat etmeniz gereken bir şey.


1

Bunu .NET Core 1.1'i 2.1'e yükseltirken yaşadım.

Burada özetlenen talimatları uyguladım .

.Csproj dosyasını kaldırmayı <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>veya <NetStandardImplicitPackageVersion>bölümlemeyi deneyin .


1

4.6.1'den 4.7.2'ye taşınan uygulama dağıtıldıktan sonra üretim sunucusunda bu hatayı almaya başladık.

Burada .NET framework 4.7.2'nin kurulu olmadığını fark ettik. Bu sorunu çözmek için aşağıdaki adımları uyguladık:

  1. .NET Framework 4.7.2'yi şuradan yükledim:

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

  2. Makineyi yeniden başlattı

  3. .NET sürümünü nasıl bulurum? Yardımıyla .NET Framework sürümünü doğruladım.

Uygulamayı makinede .Net Framework 4.7.2 sürümü ile tekrar çalıştırmak sorunu çözdü.


1

Aynı Sorunla karşı karşıyayım Şimdi Kur Uygulamasını takiben yapıyorum Uygulama İyi çalışıyor

1-

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

2- Referans Ekle

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


Bu nerede belgeleniyor? Bu satırı bir web.config dosyasına koymayı kim tahmin edebilir? Bu arada, eşit derecede iyi çalışan şey, csproj'a "netstandard" ı referans alan bir satır eklemek ve CopyLocal'ı true olarak ayarlamaktır. Öyle olsa bile, bu herhangi bir yerde referanslar iletişim kutusunda olası bir referans olarak listelenmiyor, bu yüzden onu almanın tek yolu manuel olarak eklemektir. Bu delilik. Ve .NET standardıyla tamamen uyumlu olması beklenen .NET 4.7.2'yi hedefliyorum, ancak çalışması için bu belirsiz adımları uygulamam gerekiyor.
Triynko

0

Şunlardan biriyle yapmak zorunda kalabilirsin:

  1. Daha yeni bir SDK yükleyin.
  2. .Csproj'da Referans Include = "netstandard" için kontrol edin
  3. Views \ Web.config ve Web.config dosyasındaki derleme etiketlerindeki derleme sürümlerini kontrol edin.

tamam umarım neredeyse geldik. "NETStandard.Library.NETFramework yerine NETStandard.Library başvurusunu ekledim" bu gönderiyi kontrol edin: github.com/dotnet/standard/issues/391
ivw

Genellikle System.Transactions referanslarınızın bir parçası değildir, bunu referanslarınıza eklemeye çalışın: Web Uygulaması kullanıyorsanız referanslarınıza sağ tıklayın veya Web Sitesini kullanıyorsanız Projenizde. .NET başvurularında System.Transactions bulun. Referanslarınızda System.Transactions bulmalısınız.
ivw


0

Bir .NET4.6.1 kitaplığına .NETStandard bağımlılığı eklemeye çalışırken ve bunu Linux'ta Mono 4.6.2 (Ubuntu 16.04 ile birlikte gelen sürüm) ile derlerken bu sorunla karşılaşıyordum.

Sonunda bugün çözdüm; çözüm şunların her ikisini de yapmayı gerektirir:

  1. Değişim <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>için <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>.Csproj dosyasında.
  2. Mono'nuzu daha yeni bir sürüme yükseltin. 5.x'in çalışması gerektiğine inanıyorum, ancak emin olmak için, Mono 6.8.0.105'i içeren Ubuntu 20.04'ü (bu yazım sırasında yalnızca önizleme aşamasındadır) yükleyebilirsiniz.

0

Projenizde web.config'inize ekleyebilirsiniz.

MVC ile çalıştığı için web.config projelerine eklediğinizde çalışmaz.


0

Benim durumumda sorunlu nuget'in 4.5.1 sürümünde System.Memory olduğunu öğrendim. 4.5.3 sürümüne güncellendiğinde çalışır !!


0

Web.config dosyasına sahip olmayanlar. Web uygulaması dışındaki Çıktı Türü. proje dosyasını (.csproj) aşağıdaki kodla güncelleyin.

.Net çerçevesinin yanlış bir şekilde eklenmesi / kaldırılması nedeniyle ortaya çıkabilir veya beklenmedik bir şekilde bozulabilir.

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

Çıkış Tipi

  • Konsol uygulaması
  • Sınıf Kitaplığı

-5

Bu sorun, yüklü görsel stüdyo ve Windows sürümünüze dayanmaktadır, aşağıdaki adımları takip edebilirsiniz: -

  1. Komut Penceresine git
  2. PCL'nizi aşağıdaki komutla düşürdüler

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Projenizi Yeniden Oluşturun.
  4. Şimdi gerekli çıktıyı görebileceksiniz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.