Programing

사전 정의 된 유형 'System.ValueTuple´2'가 정의되지 않았거나 가져 오지 않았습니다.

lottogame 2020. 2. 29. 13:32
반응형

사전 정의 된 유형 'System.ValueTuple´2'가 정의되지 않았거나 가져 오지 않았습니다.


Visual Studio 15 Preview 3을 설치하고 새로운 튜플 기능을 사용하려고했습니다.

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

컴파일 할 때 오류가 발생합니다.

사전 정의 된 유형 'System.ValueTuple´2'가 정의되지 않았거나 가져 오지 않았습니다.

블로그 게시물 에 따르면 이 기능은 기본적으로 "설정"되어 있어야합니다.

내가 뭘 잘못 했어?


.NET 4.6.2 이하, .NET Core 1.x 및 .NET Standard 1.x의 경우 NuGet 패키지를 설치해야합니다 System.ValueTuple.

Install-Package "System.ValueTuple"

또는 VS 2017에서 패키지 참조 사용 :

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

.NET Framework 4.7, .NET Core 2.0 및 .NET Standard 2.0에는 이러한 유형이 포함됩니다.


의 일부입니다 .NET Framework 4.7.

위의 프레임 워크 이상 (또는 .NET Core 2.0/ .NET Standard 2.0)을 타겟팅하지 않는 한 참조해야합니다 ValueTuple. 이 작업을 추가하여System.ValueTuple NuGet Package


ValueTuple 유형은 최신 프레임 워크에 내장되어 있습니다.

  • .NET Framework 4.7
  • .NET 코어 2.0
  • 모노 5.0
  • .Net 표준 2.0

최신 프레임 워크 버전 중 하나를 대상으로 할 때까지 ValueTuple 패키지를 참조해야합니다.

http://blog.monstuff.com/archives/2017/03/valuetuple-availability.html 에서 자세한 내용


들어 비주얼 스튜디오 코드 에 내장 된 사용 터미널 및 실행 :

dotnet add package "System.ValueTuple"

dotnet restore나중에 달리는 것을 잊지 마십시오 .


VS 용 .NET 4.6.2 Developer Pack 이 설치되어 있는지 확인한 다음 System.ValueTupleNuGet 에서 패키지를 가져 오십시오.


다른 사람들이 같은 문제를 겪고 있다면 프로젝트를 4.7로 업데이트 한 후이 오류가 발생했습니다. 이상하게 도이 오류가 사라지려면 System.ValueTuple 참조를 제거해야했습니다.


ValueTuple.net Framework 프로젝트에 패키지 참조로 추가하는 것은 좋지 않습니다 . 아시다시피이 어셈블리는 4.7 .NET Framework에서 사용할 수 있습니다.

프로젝트가 ValueTuple패키지 폴더 대신 .NET Framework 폴더의 모든 비용을 포함하려고 할 때 특정 어셈블리가 발견되지 않는 오류가 발생할 수 있습니다.

우리는 오늘 회사에서이 문제를 겪었습니다. 우리는 2 개의 프로젝트로 솔루션을 가지고있었습니다 (나는 그것을 단순화했습니다) :

  • Lib
  • Web

LibValueTuple을 포함하고을 사용하고 Web있었습니다 Lib. 그것은 알 수없는 이유에 의해 밝혀졌다 Web에 해결 경로로 시도 할 때 ValueTuple가졌다 HintPath.NET 프레임 워크 디렉토리에 잘못된 버전을 복용했다. 그로 인해 애플리케이션이 충돌했습니다. ValueTuple에 정의되지 않은 .csprojWebHintPath그 조립. 문제는 매우 이상했다. 일반적으로 패키지 폴더에서 어셈블리를 복사합니다. 이번은 정상이 아니었다.

나를 위해 항상 System.*패키지 참조 를 추가하는 것은 위험합니다 . 그들은 종종 시한 폭탄과 같습니다. 그들은 처음에는 괜찮으며 최악의 순간에 당신의 얼굴에서 폭발 할 수 있습니다. 내 규칙 : 실제로 필요하지 않은 경우 .NET FrameworkSystem.* 용 Nuget 패키지를 사용하지 마십시오 .

프로젝트 내의 파일에 수동 ValueTuple으로 추가하여 문제를 해결 했습니다..csprojWeb


System.ValueTuple.dll 파일이 소스 제어하에 있는지 확인하고 .cssproj 파일에서 해당 참조를 수정해야했습니다.

  1. 솔루션의 각 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 프로젝트를 내리다
  3. .cssproj 파일 편집 : 변경

<참조 Include = "System.ValueTuple">

<힌트 패스>

.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll

</ 힌트 경로>

</ 참조>

으로

<참조 Include = "System.ValueTuple">

<힌트 패스>

.. \ packages \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ 힌트 경로>

</ 참조>

  1. 변경 사항 저장 및 프로젝트 다시로드
  2. System.ValueTuple.dll을 찾아이 폴더에 저장하십시오.
  3. 이 파일의 참조를 소스 컨트롤에 추가

(선택 사항) : 7. 다른 .dll 파일과 동일한 문제를이 방법으로 해결


Framework 4.5.2를 대상으로하는 이전 프로젝트 중 하나에서도 이와 동일한 문제가 발생했습니다. 위에 나열된 모든 시나리오를 포함하여 여러 시나리오를 시도했습니다 .target 4.6.1, System.ValueTuple 패키지 추가, bin, obj 및 .vs 폴더 삭제. 주사위가 없습니다. 4.7.2에 대해 동일한 프로세스를 반복하십시오. 그런 다음 한 의견자가 제안한대로 4.7.2를 대상으로했기 때문에 System.ValueTuple 패키지를 제거하려고했습니다. 여전히 아무것도 없습니다. csproj 파일 참조 경로를 확인했습니다. 옳아 보인다. 심지어 4.5.2로 내려 가서 패키지를 다시 설치했습니다. 여러 VS를 다시 시작하고 동일한 폴더를 여러 번 삭제하면이 모든 것이 가능합니다. 말 그대로 아무것도 효과가 없었습니다.

대신 구조체를 사용하기 위해 리팩터링해야했습니다. 앞으로도 다른 사람들이 계속해서이 문제를 겪지 않기를 바랍니다. 그러나 우리가 그랬던 것처럼 결국에는 이것이 도움이 될 것이라고 생각했습니다.


.NET 4.6.2에서 .NET 4.7.2로 업그레이드 하면서이 문제가 발생했습니다. 불행히도, System.ValueTuple사용하는 다른 NuGet 패키지가 의존 하기 때문에 패키지 참조를 제거 할 수 없었 습니다.

마지막으로 근본 원인을 찾을 수있었습니다 mscorlib.dll. 프로젝트 폴더에 .NET 4.6.2 버전이 놓여 있었고 (게시 작업의 출력) MSBuild는 공식 .NET 4.7.2 참조 대신이 어셈블리를 참조하기로 결정했습니다. 에 위치한 어셈블리 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

System.ValueTuple이 .NET 4.7에 도입 되었기 때문에 MSBuild는 .NET 4.6.2의 참조 어셈블리에서 형식을 찾을 수 없으므로 컴파일에 실패했습니다.

( https://stackoverflow.com/a/57777123/128709 중복 )

참고 URL : https://stackoverflow.com/questions/38382971/predefined-type-system-valuetuple%c2%b42%c2%b4-is-not-defined-or-imported



반응형