어셈블리 'netstandard, Version = 2.0.0.0'에 대한 참조를 추가해야합니다.


124

이 프로젝트는 .NET Framework 4.6.1을 대상으로하는 ASP.NET MVC 웹앱입니다.

갑자기 (일부 NuGet 패키지가 업그레이드 됨) 런타임 중에 다음 오류가 발생하기 시작했습니다.

CS0012 : 'System.Object'형식이 참조되지 않은 어셈블리에 정의되어 있습니다. 어셈블리 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'에 대한 참조를 추가해야합니다.

내 메인 뷰 Index.cshtml에서 내가 사용하는 라인에서@Html.ActionLink

내 컴퓨터에 .NET Core SDK 2.0 및 .NET Framework 4.7.1이 설치되어 있지만 이에 대한 참조를 포함하고 싶지 않습니다. 이것은 .NET Framework 웹앱 전용이며 설치된 프레임 워크가 4.6.1 인 Windows IIS에서 호스팅되며 서버에 NET Core가 설치되어 있지 않습니다.

그렇다면 왜 참조를 추가하도록 요청 netstandard합니까? 참조하지 않고 netstandard전체 Windows .NET Framework 4.6.1을 수정하려면 어떻게해야 합니까?

잘 작동했던 이전 커밋을 확인했는데 여전히이 오류가 발생합니다. 따라서 업그레이드되는 NuGet 패키지와 관련이 없습니다. 내 로컬 개발 시스템에 뭔가있는 것 같습니다.

앱을 디렉토리에 게시하고 IIS로 실행하면 작동합니다.

.csproj 요점에 링크

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>

VS2017을 사용하여 파일 시스템에 앱을 게시 할 때 출력에 다음 경고가 표시됩니다.

다음 어셈블리에는 대상보다 높은 .NET Framework 버전에 대한 종속성이 있으며 런타임 중에 제대로로드되지 않아 오류가 발생할 수 있습니다 : netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51. 종속성은 System.Transactions, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089입니다. 종속 어셈블리가 대상 프레임 워크에 대해 올바른지 확인하거나 주소를 지정하는 대상 프레임 워크가 종속 어셈블리의 프레임 워크인지 확인해야합니다.

하지만에서 아무것도 찾을 수 없습니다 System.Transactions. 그것을 참조하는 것을 어떻게 검색 할 수 있습니까?


1
어떤 NuGet 패키지를 사용하고 있습니까? ASP.NET Core를 참조하고 있지 않습니까?
Ricardo Peres

@RicardoPeres VS2017에서는 프로젝트가 대상으로하는 것과 다른 프레임 워크를 대상으로하는 패키지를 추가 할 수 없습니다. 모든 패키지를 제거하고 다시 설치했지만 오류는 동일합니다. 그런 일이 심지어 왜 런타임 중에 내가 왜 ... 이해가 안 돼요
emzero

2
System.Data.SQLite.Core패키지는 .NET 코어를 기반으로 (또는 .NET 표준, 나는 소스 또는 문서를 찾고 가지 않았다). 프로젝트 파일 맨 끝에있는 오류 메시지를 확인하십시오.
McGuireV10

.NET Core를 기반으로하는 이유는 무엇입니까? packages\System.Data.SQLite.Core.1.0.108.0\lib디렉터리를 보고 있는데 여기에는 내가 사용중인 4.6을 포함하여 .NET Framework의 각 버전에 대한 폴더가 포함되어 있습니다. 나는 그것이 여기서 문제라고 생각하지 않습니다.
emzero

2
이와 같이 해결할 수없는 문제가 발생하면 1) 프로젝트의 참조가 무엇인지주의 깊게 기록 (또는 .csproj를 어딘가에 저장), 2) packages.config 파일을 제거하고, 모든 외부 참조를 제거합니다 (또는 새 프로젝트를 작성할 수 있음). 원본 정적 파일, .cs 등으로 만 처음부터), 3) 기존 packages.config 모드 대신 Package Reference를 사용하도록 VS Nuget 구성 docs.microsoft.com/en-us/nuget/reference/… 및 4) 필요한 모든 참조를 다시 추가하십시오. 대부분의 경우 작동하며 이전에 실패한 이유를 알 수 없습니다.
Simon Mourier

답변:


181

해결책은 GitHub에서이 문제 일 수 있다고 생각합니다 .

다음과 같이 web.config에 netstandard 참조를 추가해보십시오. "

<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을 사용하고 있지만 이전 Framework 버전이 .NET Standard 2.0과 완전히 호환되지 않으므로 .NET 4.7.1을 선택하는 것이 중요합니다.

.NET Standard 라이브러리를 도입했을 때 NUGET 패키지와 참조가 깨지는 데 많은 문제가있었습니다. 고려해야 할 다른 변경 사항은 파일 대신 PackageReferences 로 업그레이드하는 것입니다 package.config.

이 가이드를 참조 하면 업그레이드에 도움 이되는 도구 가 필요할 수도 있습니다 . 그래도 늦은 VS 15.7 버전이 필요합니다.


2
여기에 도착한 사람은 Newtonsoft.JSON의 작성자가 작성한 오픈 소스 라이브러리 작성에 대한이 훌륭한 지침을 참조해야한다고 생각합니다. docs.microsoft.com/en-us/dotnet/standard/library-guidance/…- 특히 " netstandard1.x "타겟을 포함하고 .netstandard 2.0을 지원하는 가장 낮은 실제 버전으로 .NET 4.7.2를 사용합니다
Quango

v4.7.2 (비 핵심 앱)로 업그레이드 할 때 정확히 필요한 것이었고 다음과 같은 예외가 발생했습니다. " 'DateTime'유형이 참조되지 않는 어셈블리에 정의되어 있습니다. 어셈블리 'netstandard, Version'에 대한 참조를 추가해야합니다. = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51 '.
Ted

csproj 파일의 참조에도 추가해야합니까, 아니면 web.config에서만 필요합니까?
petrosmm

1
좋은 대답입니다. 감사. 나는 오래된 유틸리티 패키지를 업그레이드하는 과정에서 새로운 표준 2.0을 그 자리에 두었습니다. 이 웹 앱은 특히 문제가 있었는데 왜냐하면 <add assembly="netstandard이 누락되었고 httpRuntime이 4.7.1-이 아니었기 때문입니다. 이것이 답입니다! 감사 !!
Piotr Kula

우리의 경우 4.7.2 ASP.Net 프로젝트에서 여러 표준 2.0 어셈블리를 사용했지만 System.Text.Json.Serialization 네임 스페이스의 일부 JsonConverter를 표준 2.0 프로젝트 중 하나에 추가했고 이로 인해이 오류가 발생했습니다. 이 솔루션으로 문제가 해결되었습니다.
ShaneH

35

.csproj 파일을 수동으로 편집하고 아래 참조를 추가하면 저에게 효과적이었습니다.

<Reference Include="netstandard" />

여기에서 제안한 Fahad Alshaya에게 감사합니다 .


프로젝트 파일 내 어디에 넣어야합니까? 다른 "태그"안에 있습니까?
Ulysses Alves

1
다음 다른 참조 태그 @UlyssesAlves 어딘가에
kamilk

@kamilk "어딘가 옆에있는"은 매우 정확하지 않습니다. 글쎄, 나는 다른 프로젝트를 살펴 보았지만 불행히도 이것은 나를 위해 작동하지 않았고 프로젝트의 .net 버전을 변경하지 않는 다른 관점 에서이 문제를 공격하기로 결정했습니다.
Ulysses Alves

1
이것은 나를 위해 일했으며 NuGet을 통해 NetStandard.Library를 설치해야했습니다.
데이비드 ACERO

"당신을"얻는 작은 것들 ... 좋은 대답입니다.
Benj Sanders

15

이 스레드에서 다른 사람들의 답변을 조합해야했습니다.

  1. NuGet을 통해 NetStandard.Library 설치
  2. .csproj 파일을 수동으로 편집하고 참조를 추가합니다. <Reference Include="netstandard" />
  3. 확장 프로젝트-> VS 솔루션 탐색기에서 참조, 'netstandard'를 마우스 오른쪽 단추로 클릭하고 속성 페이지를 표시하고 "로컬 복사"를 true로 설정합니다.

3
'로컬 복사'로 설정했습니다.
FrenkyB

1
이 솔루션은 완벽하게 작동하며 프로젝트는 디버그 모드에서 컴파일하는 데 의존하지 않습니다.
DarkHawk

6

나는 이전에 이것을 겪었고 여러 가지 시도를 통해 나를 위해 해결했습니다.

  • bin 폴더가있는 경우 삭제
  • 숨겨진 .vs 폴더 삭제
  • 4.6.1 타겟팅 팩이 설치되어 있는지 확인
  • 마지막 도랑 노력 : System.Runtime에 대한 참조를 추가합니다 (프로젝트를 마우스 오른쪽 버튼으로 클릭-> 추가-> 참조-> System.Runtime 옆에있는 상자를 선택합니다). 위의 방법 중 하나가 대신 해결했다고 생각합니다. 이 일의.

또한 이것이 전체 프레임 워크에서 실행되는 .net 핵심 앱인 경우 프로젝트의 루트에 global.json 파일 을 포함하고 해당 프로젝트에 사용할 SDK를 가리켜 야합니다.

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

2
모두 시도했지만 운이 없습니다. 이것은 내가 말했듯이 .NET Core 프로젝트가 아닙니다. 이것은 정상적인 .NET Framework 4.6.1입니다.
emzero

VS를 닫고, bin을 삭제하고, .vs를 삭제합니다.
Reed Shilts


5

4.6.1 프레임 워크에서 4.7.2로 업그레이드 한 후이 오류가 발생하기 시작했습니다.

" 'System.Object'형식은 참조되지 않는 어셈블리에 정의되어 있습니다. 'netstandard, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51'어셈블리에 대한 참조를 추가해야합니다." 궁극적으로 해결책은 위에서 언급 한 "netstandard"어셈블리 참조를 추가하는 것이 었습니다.

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

1
작동합니다. (이 변경없이) 작동하는 또 다른 일은 <Reference Include="netstandard" />csproj 파일에 를 추가하는 것입니다. 그러나 CopyLocal을 true로 설정 한 경우에만 작동합니다. 이 중 어느 것도 의미가 없습니다.
Triynko

1

이것은 오래된 스레드이지만 오늘 같은 문제가 발생했습니다. 지난주에 일부 NuGet 패키지를 업데이트했으며 MVC 웹 사이트가 테스트 서버에 게시했을 때 개발 컴퓨터에서 정상적으로 작동했지만 실패했습니다.

나는 수많은 게시물을 읽었지만 아무것도 작동하지 않았습니다. 마침내 내 로컬 저장소의 DLL을 테스트 서버의 DLL과 비교 한 결과 netstandard.dll이 업로드되지 않았 음을 발견했습니다. 일단 업로드 된 웹 사이트가 정상적으로 작동했지만 VS2017 웹 배포가 DLL을 게시하지 않은 이유를 모르겠습니다.

위의 어느 것도 당신을 위해 작동하지 않는 경우를 대비하여 조심해야 할 것입니다.


1

.NET Core 1.1을 2.1로 업그레이드 할 때 이것을 경험했습니다.

여기에 설명 된 지침을 따랐습니다 .

.csproj에서 <RuntimeFrameworkVersion>1.1.1</RuntimeFrameworkVersion>또는 <NetStandardImplicitPackageVersion>섹션 을 제거하십시오 .


1

4.6.1에서 4.7.2로 마이그레이션 된 애플리케이션을 배포 한 후 프로덕션 서버에서이 오류가 발생하기 시작했습니다.

.NET 프레임 워크 4.7.2가 여기에 설치되지 않은 것을 확인했습니다. 이 문제를 해결하기 위해 다음 단계를 수행했습니다.

  1. 다음에서 .NET Framework 4.7.2를 설치했습니다.

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

  2. 기계를 다시 시작했습니다.

  3. .NET 버전은 어떻게 찾습니까? 의 도움으로 .NET Framework 버전을 확인했습니다 .

.Net Framework 4.7.2 버전이 컴퓨터에 설치된 상태에서 응용 프로그램을 다시 실행하면 문제가 해결되었습니다.


1

동일한 문제에 직면하고 있습니다. 지금 설치 응용 프로그램이 잘 작동합니다.

1-

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

2- 참조 추가

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

삼-

Copy Above Path Dll to Application Bin Folder on web server


이 문서는 어디에 있습니까? 이 줄을 web.config 파일에 넣는 방법을 어떻게 추측할까요? 똑같이 잘 작동하는 것은 "netstandard"를 참조하는 csproj에 줄을 추가하고 CopyLocal을 true로 설정하는 것입니다. 그럼에도 불구하고 어디에서나 참조 대화 상자에 가능한 참조로 나열되지 않았으므로 가져올 수있는 유일한 방법은 수동으로 추가하는 것입니다. 이건 미쳤어. 그리고 저는 .NET 표준과 완전히 호환되어야하는 .NET 4.7.2를 목표로하고 있지만, 작동하려면이 모호한 단계를 수행해야합니다.
Triynko

0

다음 중 하나를 수행해야 할 수 있습니다.

  1. 최신 SDK를 설치하십시오.
  2. .csproj에서 Reference Include = "netstandard"확인
  3. Views \ Web.config 및 Web.config의 컴파일 태그에서 어셈블리 버전을 확인합니다.

좋습니다. 거의 다 왔으면 좋겠습니다. "NETStandard.Library.NETFramework 대신 NETStandard.Library에 대한 참조를 추가했습니다."이 게시물을 확인하십시오. github.com/dotnet/standard/issues/391
ivw

일반적으로 System.Transactions는 참조의 일부가 아니므로 다음과 같이 참조에 추가하십시오. 웹 응용 프로그램을 사용하는 경우 참조를 마우스 오른쪽 단추로 클릭하고 웹 사이트를 사용하는 경우 프로젝트에서 마우스 오른쪽 단추를 클릭하십시오. .NET 참조에서 System.Transactions를 찾으십시오. 참조에서 System.Transactions를 찾아야합니다.
ivw


0

.NETStandard 종속성을 .NET4.6.1 라이브러리에 추가하고 Linux에서 Mono 4.6.2 (Ubuntu 16.04와 함께 제공되는 버전)로 컴파일 할 때이 문제에 직면했습니다.

오늘 드디어 해결했습니다. 솔루션은 다음 두 가지를 모두 수행해야합니다.

  1. 변경 <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion><TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>.csproj 파일입니다.
  2. 모노를 최신 버전으로 업그레이드하십시오. 5.x가 작동해야한다고 생각하지만 확실히 모노 6.8.0.105가 포함 된 Ubuntu 20.04 (작성 당시에는 미리 보기로 만 제공됨)를 설치할 수 있습니다.

0

프로젝트에서 web.config에 추가 할 수 있습니다.

MVC에서 작동하기 때문에 web.config 프로젝트에 추가하면 작동하지 않습니다.


0

제 경우에는 문제가되는 너겟이 버전 4.5.1의 System.Memory라는 것을 알았습니다. 버전 4.5.3으로 업데이트하면 작동합니다 !!


0

web.config 파일이없는 분. 웹 애플리케이션 이외의 출력 유형. 아래 코드로 프로젝트 파일 (.csproj)을 업데이트하십시오.

.netframework를 부적절하게 추가 / 제거하여 발생하거나 예상치 못한 방식으로 중단 될 수 있습니다.

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

출력 유형

  • 콘솔 애플리케이션
  • 클래스 라이브러리

-5

이 문제는 설치된 Visual Studio 및 Windows 버전을 기반으로하며 다음 단계를 수행 할 수 있습니다.

  1. 명령 창으로 이동
  2. 다음 명령으로 PCL을 다운 그레이드했습니다.

    Install-Package Xamarin.Forms -Version 2.5.1.527436
  3. 프로젝트를 다시 빌드하십시오.
  4. 이제 필요한 출력을 볼 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.