[.net] Visual Studio 2017-파일 또는 어셈블리 ‘System.Runtime, Version = 4.1.0.0’또는 해당 종속성 중 하나를로드 할 수 없습니다.

Visual Studio 2017을 사용하고 있으며 .Net Standard 1.5 라이브러리를 만들고 .Net 4.6.2 nUnit 테스트 프로젝트에서 사용하려고합니다.

다음과 같은 오류가 발생합니다.

파일 또는 어셈블리 ‘System.Runtime, Version = 4.1.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a’또는 해당 종속성 중 하나를로드 할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다.

나는 다음을 시도했다 :

  1. 프로젝트 참조로 Std 라이브러리를 참조하십시오. 오류 : 이전 오류를 표시합니다.
  2. 내 Std 라이브러리에 대한 NuGet pkg를 만들고 참조하십시오. 오류 : 형식은 System.String이며 System.String이 필요합니다. 이는 System.Runtime이 결국 프로젝트에서 참조되고 모든 표준 형식에 대한 정의가 있기 때문입니다.
  3. 참조 NuGet pkg NetStandard.Library. 오류 : # ( “유형은 System.String, System.String 예상”)과 동일한 오류를 제공합니다. 참고 :이 작업을 수행하기 전에 프로젝트에서 모든 NuGet 패키지를 지운 다음 nUnit 및 NetStandard.Library 패키지 (45 개의 다른 패키지를 설치 함) 만 추가했습니다.

이것은 버그입니까? 해결 방법이 있습니까? 도움을 주시면 감사하겠습니다.



답변

나는 똑같은 문제가 있었고 내가 찾은 제안 된 해결책이 없었다. 이 문제에 대한 내 해결책은 App.config 및 packages.config를 확인하여 버전이 일치하는지 확인하는 것입니다.

원래 내 app.config에는 다음이 포함되었습니다.

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

그러나 packages.config에는 다음이 포함되었습니다.

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

newVersion에 대한 packages.config와 일치하도록 app.config 항목을 수정했습니다.

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

변경 후 문제가 해결되었습니다.


답변

이 문제는 .NET 4.x 프로젝트에서 .NET Standard 프로젝트를 참조 할 때 발생합니다. .NET Standard 프로젝트의 nuget 패키지 참조는 종속성으로 가져 오지 않습니다.

이 문제를 해결하려면 .NET 4.x csproj 파일이 현재 빌드 도구 (최소 14 개)를 가리키는 지 확인해야합니다.

<Project ToolsVersion="15.0">...

아래는 더 이상 필요하지 않으며 VS 15.3에서 수정되었습니다.

있었다 알려진 버그 VS2017에서 특히 NuGet 4.0.

버그를 해결하려면 .NET 4.x 프로젝트 용 .csproj 파일을 열고 다음 코드 조각을 추가해야합니다.

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

NuGet 4.x는 더 이상 packages.config가 아닌 “패키지 참조”를 제공하지만 이전 4.x 파이프 라인은 VS2017 출시 시점에 완전히 업데이트되지 않았습니다. 위의 스 니펫은 종속성에서 패키지 참조를 올바르게 포함하도록 빌드 시스템을 “깨우는”것처럼 보입니다.


답변

최근에이 문제가 발생하여이 스레드 및 기타 항목에서 언급 된 많은 것을 시도했습니다. 나는에 대한 패키지 참조를 추가 "System.Runtime", nuget 패키지 관리자에 의해 바인딩 redicts을 고정 app.config하고 있는지 확인이 app.configpackage.config어셈블리에 대해 동일한 버전을 가지고있다. 그러나 문제는 계속되었습니다.

마지막으로 <dependentAssembly>어셈블리 의 태그를 제거 하고 문제가 사라졌습니다 . 따라서 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>

편집 :
.NET 프레임 워크를 4.7.2로 업데이트 한 후 문제가 다시 나타납니다. 위의 트릭을 시도했지만 작동하지 않았습니다. 많은 시간을 낭비한 후 System.Linqapp.config 의 오래된 참조로 인해 문제가 발생한다는 것을 깨달았습니다 . 따라서이 문제를 제거하려면 모든 Linq 참조를 제거하거나 업데이트하십시오.


답변

저를 믿으세요, 농담이 아닙니다. app.config에서 모든 System.Runtime 종속성을 제거하면 작동이 시작됩니다.


답변

NUnit-Project에서 NetStandard.Library 및 다음 app.config 파일 을 참조하여 해당 오류를 해결했습니다 .

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

편집하다

System.Runtime, System.Reflection또는 이외의 항목 System.Runtime.InteropServices이 누락 된 경우 (예 🙂 System.LinqdependentAssembly노드를 추가 하십시오.

편집 2

새로운 Visual Studio 버전 (2017 15.8 내 생각)에서는 Studio가 app.config 파일을 생성 할 수 있습니다. 그냥 확인 자동 생성 바인딩 리디렉션 에서 체크 박스 응용 프로그램 – 프로젝트 – 속성을 .
바인딩 리디렉션 자동 생성

편집 3

바인딩 리디렉션 자동 생성 은 .NET 클래스 라이브러리에서 제대로 작동하지 않습니다. csproj 파일에 다음 줄을 추가하면이 문제가 해결되고 Classlibary에 대해 작동하는 .config 파일이 생성됩니다.

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>


답변

app.config를 삭제하여 수정했습니다.

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

항목.

app.config 리팩토링 중에 자동으로 추가되었지만 필요하지 않음


답변

이 문제는 .NET 4.x 프로젝트에서 .NET Standard 프로젝트를 참조 할 때 발생합니다. .NET Standard 프로젝트의 nuget 패키지 참조는 종속성으로 가져 오지 않습니다.

System.Runtime 4.3및 NETStandard.Library 패키지 를 추가 하고 !! 중요 !! 리팩터링 도구를 사용하여 System.Runtime.dll 버전을 조회했지만 4.1.1.1그렇지 않은 4.3다음 .config에 bindingRedirect를 추가합니다.

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