Bạn phải thêm tham chiếu đến assembly 'netstandard, Phiên bản = 2.0.0.0


124

Dự án là một Ứng dụng Web ASP.NET MVC nhắm mục tiêu .NET Framework 4.6.1.

Đột nhiên (một số gói NuGet đã được nâng cấp), tôi bắt đầu gặp lỗi sau trong thời gian chạy:

CS0012: Loại 'System.Object' được xác định trong một hợp ngữ không được tham chiếu. Bạn phải thêm tham chiếu đến assembly 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'.

Theo quan điểm chính của tôi Index.cshtml, trong một dòng mà tôi sử dụng@Html.ActionLink

Tôi đã cài đặt .NET Core SDK 2.0 và .NET Framework 4.7.1 trong máy của mình nhưng tôi không muốn bao gồm tham chiếu đến nó. Đây chỉ là một ứng dụng web .NET Framework, nó được lưu trữ trên Windows IIS trong đó khung được cài đặt là 4.6.1, không có NET Core nào được cài đặt trong máy chủ.

Vậy tại sao nó lại yêu cầu thêm tham chiếu vào netstandard? Làm cách nào để khắc phục sự cố mà không cần tham chiếu netstandardđến Windows .NET Framework 4.6.1 đầy đủ?

Tôi đã kiểm tra một cam kết trước đó hoạt động tốt và tôi vẫn gặp lỗi này. Vì vậy, nó không liên quan đến các gói NuGet đang được nâng cấp. Có vẻ là thứ gì đó trên máy dev cục bộ của tôi.

Nếu một ứng dụng xuất bản vào một thư mục và chạy nó với IIS thì nó sẽ hoạt động.

Liên kết tới .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>

Khi xuất bản ứng dụng bằng VS2017 lên hệ thống tệp, tôi nhận được cảnh báo sau trong đầu ra:

Hợp ngữ sau có phụ thuộc vào phiên bản .NET Framework cao hơn mục tiêu và có thể không tải chính xác trong thời gian chạy gây ra lỗi: netstandard, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = cc7b13ffcd2ddd51. Các thành phần phụ thuộc là: System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089. Bạn nên đảm bảo rằng hợp ngữ phụ thuộc là chính xác cho khung mục tiêu hoặc đảm bảo rằng khung mục tiêu bạn đang giải quyết là của hợp ngữ phụ thuộc.

Nhưng tôi không thể tìm thấy bất cứ điều gì trên System.Transactions. Làm cách nào để tôi có thể tìm kiếm những gì liên quan đến nó?


1
Bạn đang sử dụng gói NuGet nào? Bạn có chắc là mình không tham chiếu đến ASP.NET Core không?
Ricardo Peres

@RicardoPeres VS2017 không cho phép bạn thêm gói nhắm mục tiêu một khung khác với khung mà dự án đang nhắm mục tiêu. Tôi đã gỡ cài đặt và cài đặt lại tất cả các gói nhưng lỗi vẫn vậy. Tôi không hiểu tại sao nó xảy ra và thậm chí tại sao trong thời gian chạy ...
emzero

2
Các System.Data.SQLite.Coregói dựa trên NET Core (hoặc NET Standard, tôi đã không đi tìm kiếm các nguồn hoặc tài liệu). Xem thông báo lỗi ở cuối tệp dự án của bạn.
McGuireV10

Tại sao bạn nói là dựa trên .NET Core? Tôi đang xem packages\System.Data.SQLite.Core.1.0.108.0\libthư mục và nó chứa một thư mục cho từng phiên bản .NET Framework, bao gồm 4.6 là những gì tôi đang sử dụng. Tôi không nghĩ đó là vấn đề ở đây.
emzero

2
Khi tôi phải đối mặt với những vấn đề nan giải như thế này, điều tôi làm là 1) ghi chú cẩn thận tham chiếu của dự án là gì (hoặc lưu .csproj ở đâu đó), 2) xóa tệp package.config, xóa tất cả các tham chiếu bên ngoài (hoặc bạn có thể viết một dự án mới từ đầu chỉ với các tệp tĩnh gốc, .cs, v.v.), 3) định cấu hình VS Nuget để sử dụng Tham chiếu gói thay vì các gói hợp pháp. chế độ config docs.microsoft.com/en-us/nuget/reference/… và 4) thêm lại tất cả các tài liệu tham khảo cần thiết. Hầu hết thời gian, nó hoạt động và tôi không biết tại sao nó lại thất bại trước đó.
Simon Mourier

Câu trả lời:


181

Tôi nghĩ giải pháp có thể là vấn đề này trên GitHub :

Hãy thử thêm tham chiếu net tiêu chuẩn trong web.config như sau: "

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

Tôi nhận ra rằng bạn đang sử dụng 4.6.1 nhưng lựa chọn .NET 4.7.1 là rất quan trọng vì các phiên bản Framework cũ hơn không hoàn toàn tương thích với .NET Standard 2.0.

Tôi biết điều này từ kinh nghiệm đau đớn, khi tôi giới thiệu các thư viện .NET Standard, tôi đã gặp rất nhiều vấn đề với các gói và tham chiếu NUGET bị phá vỡ. Thay đổi khác mà bạn cần xem xét là nâng cấp lên PackageRefferences thay vì các package.configtệp.

Xem hướng dẫn này và bạn cũng có thể muốn có một công cụ để giúp nâng cấp . Tuy nhiên, nó yêu cầu phiên bản VS 15.7 muộn.


2
Tôi nghĩ rằng bất cứ ai đến đây cũng nên xem hướng dẫn tuyệt vời này về cách viết lib nguồn mở của tác giả Newtonsoft.JSON: docs.microsoft.com/en-us/dotnet/standard/library-guidance/… - đặc biệt là "Tránh bao gồm mục tiêu netstandard1.x "và sử dụng .NET 4.7.2 làm phiên bản thực thấp nhất hỗ trợ .netstandard 2.0
Quango

Chính xác những gì cần thiết khi nâng cấp lên v4.7.2 (ứng dụng không phải là ứng dụng cốt lõi) và có một ngoại lệ như sau: "Loại 'DateTime' được xác định trong một assembly không được tham chiếu. Bạn phải thêm một tham chiếu vào netstandard của assembly, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted vào

Điều này cũng phải thêm vào các tham chiếu trong tệp csproj hay nó chỉ cần thiết trong web.config?
petrosmm

1
Câu trả lời chính xác. Cảm ơn. Tôi đang trong quá trình nâng cấp một gói tiện ích cũ và thay thế nó một tiêu chuẩn 2.0 mới. Ứng dụng web này đặc biệt có vấn đề vì <add assembly="netstandardbị thiếu và cả httpRuntime không phải là 4.7.1- Đây là câu trả lời! Cảm ơn !!
Piotr Kula

Trong trường hợp của chúng tôi, chúng tôi đã có một số hội đồng tiêu chuẩn 2.0 được sử dụng bởi một dự án ASP.Net 4.7.2 nhưng chúng tôi đã thêm một số JsonConverter từ không gian tên System.Text.Json.Serialization vào một trong các dự án 2.0 tiêu chuẩn và điều đó gây ra lỗi này. Giải pháp này đã giải quyết vấn đề của chúng tôi.
ShaneH

35

Chỉnh sửa thủ công tệp .csproj và thêm tài liệu tham khảo bên dưới phù hợp với tôi.

<Reference Include="netstandard" />

Cảm ơn bạn Fahad Alshaya, người đã gợi ý nó ở đây .


Cái này nên được đặt ở đâu bên trong tệp dự án? Bên trong "thẻ" nào khác?
Ulysses Alves

1
@UlyssesAlves Một nơi nào đó bên cạnh thẻ tham khảo khác
kamilk

@kamilk "ở đâu đó bên cạnh một số khác" là không chính xác lắm. Chà, tôi đã xem xét một số dự án khác, nhưng tiếc là điều này không phù hợp với tôi và tôi đã quyết định tấn công vấn đề này từ một góc độ khác, không liên quan đến việc thay đổi phiên bản .net của dự án.
Ulysses Alves

1
Cái này phù hợp với tôi, tôi cũng phải cài đặt NetStandard.Library thông qua NuGet.
David Acero

Những điều nhỏ nhặt mà "có được bạn" ... Câu trả lời tuyệt vời.
Benj Sanders

15

Tôi đã phải thực hiện kết hợp các câu trả lời của người khác trên chủ đề này.

  1. Cài đặt NetStandard.Library qua NuGet
  2. Chỉnh sửa thủ công tệp .csproj và thêm tham chiếu. <Reference Include="netstandard" />
  3. Mở rộng dự án -> Tham chiếu trong VS Solution Explorer, nhấp chuột phải vào 'netstandard' và hiển thị trang thuộc tính và đặt "Copy Local" thành true.

3
Cài đặt 'Sao chép cục bộ' đã làm điều đó cho tôi.
FrenkyB

1
Giải pháp này hoạt động hoàn hảo, ngoài ra dự án không phụ thuộc vào việc biên dịch ở chế độ gỡ lỗi.
DarkHawk

6

Tôi đã gặp phải điều này trước đây và thử một số điều đã khắc phục được nó cho tôi:

  • Xóa một thư mục bin nếu nó tồn tại
  • Xóa thư mục .vs ẩn
  • Đảm bảo gói nhắm mục tiêu 4.6.1 được cài đặt
  • Last Ditch Effort: Thêm một tham chiếu đến System.Runtime (nhấp chuột phải vào dự án -> thêm -> tham chiếu -> đánh dấu vào hộp bên cạnh System.Runtime), mặc dù tôi nghĩ rằng tôi đã luôn tìm ra một trong những điều trên đã giải quyết nó thay thế làm điều này.

Ngoài ra, nếu đây là ứng dụng lõi .net chạy trên khung đầy đủ, tôi thấy bạn phải bao gồm tệp global.json ở gốc dự án của mình và trỏ nó đến SDK bạn muốn sử dụng cho dự án đó:

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

2
Cố gắng tất cả, không có may mắn. Đây không phải là một dự án .NET Core như tôi đã nói. Đây là .NET Framework 4.6.1 bình thường.
emzero

Đóng VS, xóa bin, xóa .vs - tôi rất vui.
Reed Shifter


5

Sau khi nâng cấp từ khung 4.6.1 lên 4.7.2, chúng tôi bắt đầu gặp lỗi này:

"Loại 'System.Object' được xác định trong một assembly không được tham chiếu. Bạn phải thêm một tham chiếu đến assembly 'netstandard, Phiên bản = 2.0.0.0, Văn hóa = trung lập, PublicKeyToken = cc7b13ffcd2ddd51'." và cuối cùng giải pháp là thêm tham chiếu lắp ráp "net tiêu chuẩn" được đề cập ở trên:

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

1
Những công việc này. Một thứ khác hoạt động (không có thay đổi này) là thêm <Reference Include="netstandard" />tệp csproj, NHƯNG ... chỉ hoạt động nếu bạn CŨNG đặt CopyLocal thành true. Không thứ gì trong đây có ý nghĩa cả.
Triynko

1

Mặc dù đây là một chủ đề cũ, tôi đã gặp vấn đề tương tự hôm nay, tuần trước tôi đã cập nhật một số gói NuGet và mặc dù trang web MVC hoạt động tốt trên máy phát triển của tôi khi tôi xuất bản lên máy chủ thử nghiệm nhưng nó không thành công.

Tôi đã đọc nhiều bài viết nhưng không có bài nào hiệu quả. Cuối cùng tôi đã so sánh tệp DLL trong thùng cục bộ của mình với tệp trong máy chủ thử nghiệm và thấy rằng netstandard.dll chưa được tải lên, sau khi tải lên trang web hoạt động tốt, không rõ tại sao triển khai web VS2017 không xuất bản tệp DLL.

Chỉ cần một cái gì đó để tìm trong trường hợp không có công việc nào ở trên phù hợp với bạn.


1

Tôi gặp sự cố này khi nâng cấp .NET Core 1.1 lên 2.1.

Tôi đã làm theo các hướng dẫn được nêu ở đây .

Cố gắng xóa <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>hoặc <NetStandardImplicitPackageVersion>phần trong .csproj.


1

Chúng tôi bắt đầu gặp lỗi này trên máy chủ sản xuất sau khi triển khai ứng dụng được chuyển từ 4.6.1 sang 4.7.2.

Chúng tôi nhận thấy rằng .NET framework 4.7.2 chưa được cài đặt ở đó. Để giải quyết vấn đề này, chúng tôi đã thực hiện các bước sau:

  1. Đã cài đặt .NET Framework 4.7.2 từ:

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

  2. Khởi động lại máy

  3. Đã xác nhận phiên bản .NET Framework với sự trợ giúp của Làm cách nào để tìm phiên bản .NET?

Chạy lại ứng dụng với phiên bản .Net Framework 4.7.2 được cài đặt trên máy đã khắc phục được sự cố.


1

Tôi đang gặp phải Vấn đề tương tự, tôi thực hiện theo Thiết lập ngay Ứng dụng hoạt động tốt

1-

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

2- Thêm tài liệu tham khảo

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


Tài liệu này ở đâu? Làm thế nào để mọi người đoán để đưa dòng này vào tệp web.config? Ngẫu nhiên, điều hoạt động tốt như nhau là thêm một dòng vào csproj tham chiếu đến "netstandard" và đặt CopyLocal thành true. Mặc dù vậy, nó thậm chí không được liệt kê là một tham chiếu có thể có trong hộp thoại tham chiếu ở bất kỳ đâu, vì vậy cách duy nhất để lấy nó là thêm nó theo cách thủ công. Thật là điên rồ. Và tôi đang nhắm mục tiêu .NET 4.7.2, được cho là hoàn toàn tương thích với tiêu chuẩn .NET, nhưng tôi phải thực hiện các bước khó hiểu này để nó hoạt động.
Triynko

0

Có thể phải làm với một trong những điều này:

  1. Cài đặt SDK mới hơn.
  2. Trong .csproj, hãy kiểm tra Tham chiếu Bao gồm = "netstandard"
  3. Kiểm tra các phiên bản hợp ngữ trong các thẻ biên dịch trong Views \ Web.config và Web.config.

được rồi, hy vọng chúng ta sắp ở đó. "Tôi đã thêm tham chiếu vào NETStandard.Library thay vì NETStandard.Library.NETFramework" hãy kiểm tra bài đăng này: github.com/dotnet/standard/issues/391
ivw

Thông thường System.Trans transaction không phải là một phần của tài liệu tham khảo của bạn, hãy thử thêm nó vào tài liệu tham khảo của bạn bằng cách: nhấp chuột phải vào tài liệu tham khảo của bạn nếu bạn đang sử dụng Ứng dụng web hoặc trong Dự án của bạn nếu bạn đang sử dụng Trang web. tìm Giao dịch Hệ thống trong tài liệu tham khảo .NET. Bạn sẽ tìm thấy Hệ thống Giao dịch trong tài liệu tham khảo của mình.
ivw


0

Tôi đã gặp sự cố này khi cố gắng thêm phần phụ thuộc .NETStandard vào thư viện .NET4.6.1 và biên dịch nó trong Linux với Mono 4.6.2 (phiên bản đi kèm với Ubuntu 16.04).

Cuối cùng tôi đã giải quyết nó ngày hôm nay; giải pháp yêu cầu thực hiện cả hai điều này:

  1. Thay đổi <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>thành <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>trong tệp .csproj.
  2. Nâng cấp mono của bạn lên phiên bản mới hơn. Tôi tin rằng 5.x sẽ hoạt động, nhưng để chắc chắn, bạn chỉ có thể cài đặt Ubuntu 20.04 (tại thời điểm viết bài này chỉ ở dạng xem trước), bao gồm Mono 6.8.0.105.

0

Bạn có thể thêm vào web.config trong dự án của mình.

Nó sẽ không hoạt động khi bạn thêm nó vào các dự án web.config vì nó hoạt động với MVC.


0

Trong trường hợp của tôi, tôi phát hiện ra rằng nuget có vấn đề là System.Memory trong phiên bản 4.5.1. khi cập nhật lên phiên bản 4.5.3 nó hoạt động !!


0

Những người không có tệp web.config. Loại đầu ra khác với ứng dụng web. cập nhật tệp dự án (.csproj) với mã cung cấp bên dưới.

Nguyên nhân có thể do thêm / xóa .netframework không đúng cách hoặc có thể bị hỏng theo cách không mong muốn.

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

Loại đầu ra

  • Ứng dụng giao diện điều khiển
  • Thư viện lớp học

-5

Sự cố này dựa trên phiên bản Visual studio và Windows đã cài đặt của bạn, bạn có thể làm theo các bước sau: -

  1. Đi tới Cửa sổ lệnh
  2. đã hạ cấp PCL của bạn bằng lệnh sau

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. Xây dựng lại dự án của bạn.
  4. Bây giờ bạn sẽ có thể thấy đầu ra cần thiết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.