csproj로 .NET Core 클래스 라이브러리를 어떻게 다중 대상으로 지정합니까?


96

.NET Core가 여전히 project.json형식을 사용하는 경우 여러 프레임 워크 (예 : net451, netcoreapp1.0)를 대상으로 하는 클래스 라이브러리를 빌드 할 수 있습니다.

이제 공식 프로젝트 형식이 csprojMSBuild를 사용하고 있으므로 대상으로 지정할 여러 프레임 워크를 어떻게 지정합니까? 내가 VS2017에서 프로젝트 설정에서이를 찾기 위해 노력하고 있어요,하지만 난 (그것도 내가 다른 모든 .NET 프레임 워크 버전 나열하지 않습니다 만 .NET 코어 프레임 워크에서 하나의 프레임 워크를 대상으로 할 수 있어요 않는 설치를) :

여기에 이미지 설명 입력


그것은 예상되는 모양이 아니며 드롭 다운에 나열된 .NETStandard 1.x 선택 사항을 가져와야합니다. 어떻게 이런 일이 발생했는지는 확실하지 않으므로 시작하려면 올바른 프로젝트 템플릿을 선택해야합니다. "Class Library (.NET Standard)"여야합니다. 콘솔 앱 템플릿을 선택한 다음 올바른 방법이 아닌 속성 변경을 시작한 것 같습니다. 실제로 Class Library 템플릿을 사용했다면 설치가 잘되지 않았습니다.
Hans Passant 2017 년

실제로 클래스 라이브러리 (.NET Core)를 선택했습니다.
Gigi

2
맞습니다. 다중 타겟팅을 원하면 잘못된 것입니다. 둘 이상의 플랫폼에서 라이브러리를 사용할 수 있도록하려면 .NETStandard를 선택해야합니다.
Hans Passant

그것은 그것을 지 웁니다. 원하는 경우 댓글에서 답변을 작성할 수 있습니다.
Gigi

답변:


122

수동으로 편집하여 프로젝트 파일 및 추가 필요 기본에 TargetFramework을 기본적으로 변경 TargetFrameworks . 그런 다음 모니 커 에 대해 ; 분리 기호.

또한 수동으로 또는 VS Nuget 패키지 관리자를 사용하여 Nuget 패키지 참조를 조건부 ItemGroup에 넣을 수 있습니다.

.csproj의 모습은 다음과 같습니다.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net452'">
    <PackageReference Include="Microsoft.Azure.DocumentDB">
      <Version>1.12.0</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
    <PackageReference Include="Microsoft.Azure.DocumentDB.Core">
    <Version>1.1.0</Version>
    </PackageReference>
  </ItemGroup>
</Project>

문서 누락으로 인해 요즘 내가 수행하는 또 다른 해결 방법은 VS2015에서 프로젝트를 만들고 사용 가능한 문서와 인텔리 젠스를 사용하여 project.json을 만든 다음 VS2017에서 솔루션을 열고 기본 제공 업그레이드를 사용하는 것입니다. 그런 다음 csproj 파일을 살펴보고 해당 구성을 수행하는 방법을 알아 봅니다.

모니 커 없이 더 난해한 타겟을 다중 타겟팅 :

마이크로 소프트 :

PCL은 권장되지 않습니다 +

PCL이 지원되지만 패키지 작성자는 대신 netstandard를 지원해야합니다. .NET Platform Standard는 PCL의 진화이며 portable-a + b + c 모니 커와 같은 정적에 연결되지 않은 단일 모니 커를 사용하여 플랫폼 간 이진 이식성을 나타냅니다.

당신이 휴대용 프로필을 대상으로 할 경우는 미리 정의되어 있지 않은 별명 도 할 수없는 추론 휴대용 프로필 정도 TargetFrameworkIdentifier, TargetFrameworkVersion하고 TargetFrameworkProfile. 또한 컴파일러 상수는 자동으로 정의되지 않습니다. 마지막으로 기본적으로 제공되지 않는 모든 어셈블리 참조를 추가해야합니다.

아래의이 예제는 dynamic키워드 를 사용한 프로젝트에서 가져온 것이므로 Microsoft.CSharp어셈블리가 추가로 필요 하므로 다른 대상에 대한 참조를 확인할 수 있습니다.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
    <DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
    <PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
    <PackageReference Include="System.ComponentModel" Version="4.3.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='net40'">
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Windows" />
  </ItemGroup>
</Project>

1
csproj를 수동으로 편집하여이 작업을 수행해야합니까, 아니면 VS를 통해 수행 할 수 있습니까?
Gigi

1
@Gigi 다중 타겟팅은 수동으로 수행해야합니다. Nuget 패키지는 VS2017을 통해 또는 수동으로 수행 할 수 있습니다.
Aboo

2
나는 같은 문제가 있었고 <TargetFramework>에 s를 추가 한 후 모든 것이 잘 작동했습니다. 정말로 이러한 것들이 더 잘 문서화되기를 바랍니다.
Negorath 2017 년

2
@AsadSaeeduddin 가능성은 Resharper가 Visual Studio가 아닌 구불 구불 한 표시를 보여줄 것입니다. $ (TargetFramework)는 특정 프레임 워크 / 모니 커에서 ItemGroup을 사용할 수 있도록하는 데 사용됩니다.
Aboo

2
NuGet 패키지가 올바르게 구성된 경우 @ORMapper는 가져올 때 자동으로 발생합니다. NuGetPackageA가 이미 여러 프레임 워크를 지원하는 경우 조정 된 항목 그룹에 넣을 필요가 없습니다. 이제 .net 프레임 워크에 대해 PackageA를 참조하고 .net 코어에 대해 PackageB를 참조해야하는 경우 조건이 지정된 항목 그룹에 넣어야합니다. 오늘 (2017 년 10 월) 현재 인터페이스에는 옵션이 없습니다.
Aboo

24

.csproj이 파일을 수동으로 편집 하고 속성을 설정할 수 있습니다 TargetFrameworks(아님 TargetFramework).

<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>

예를 들면 다음을 참조하십시오 EFCore.csproj. https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj


9
감사! 날 죽인다. 40 년 전에 쓰여진 Brian Kernigan의 "The Elements of Programming Style"에서 그는 끝에 한 글자 씩 다른 변수를 사용하는 실수에 대해 이야기합니다. 이름이 "TargetFrameworkList"이면 훨씬 더 명확했을 것입니다.
howardlo

가리키는 예제에는 <TargetFrameworks> 속성이 포함되어 있지 않습니다.
RenniePet

@RenniePet, 감사합니다! 프로젝트 파일은 시간이 지남에 따라 변경되었습니다. <TargetFrameworks>가있는 구체적인 커밋에 대한 링크를 변경했습니다.
Night walker

12

실제로 클래스 라이브러리 (.NET Core)를 선택했습니다.

라이브러리가 여러 플랫폼 대상에서 작동해야하는 경우 원하는 프로젝트 템플릿이 아닙니다. 이 프로젝트 템플릿을 사용하면 .NETCore를 대상으로하는 프로젝트에서만 라이브러리를 사용할 수 있습니다. PCL 라이브러리 접근 방식은 폐기되었으므로 이제 .NETStandard를 선택해야합니다.

"클래스 라이브러리 (.NET Standard)"프로젝트 템플릿을 사용하여 프로젝트를 시작하면됩니다. 이제 .NETStandard 버전을 선택할 수 있습니다. 현재 호환성 표 는 여기에 있습니다 .

링크 된 기사가 계속 업데이트되기를 바랍니다. 이것은 유동적이며 .NETStandard 2.0은 정해졌지만 아직 출시되지 않았습니다. 2017 년 2 분기 (아마 봄 말)를 목표로하여 현재 97 %가 완료된 것으로 나타납니다. 나는 디자이너들이 1.5 또는 1.6을 사용하는 것은 권장되지 않으며 2.0과 충분히 호환되지 않는다는 말을 들었습니다.


서로 다른 대상 프레임 워크에 대해 서로 다른 종속성이있는 경우 어떻게 작동합니까? 에 내 말은 project.json당신이 대상 프레임 워크에 대한 특정 종속성을 지정할 수 있습니다.
Gigi

1
나는 이것이 존재했다는 것을 잊을 필요가 있다고 90 % 확신합니다. .NETCore를 부트 스트랩하기위한 임시 방편 조치 일 뿐인 혼란스러운 혼란이었습니다. 내가 링크 한 호환성 그리드를 사용하십시오.
Hans Passant 2017 년

나는 많이 의심했다. 명확히 해주셔서 감사합니다!
Gigi

4
@HansPassant 다중 대상은 레거시 코드가 있고 동시에 최근 전체 프레임 워크 버전 또는 dotnetcore 중 하나에서 그린 필드 개발을 수행 할 수있는 경우 여전히 최상의 옵션입니다.
Stefano Ricciardi 2017

1
아직 그린 필드도 .NET Core 친화적 인 것은 아닙니다. Azure Function Apps를 사용하고 있지만 .NET Core 버전은 몇 가지 트리거 만 지원합니다. (저는 Service Bus 트리거가 필요하므로 .NET Framework를 사용하고 있으며 매우 큰 비즈니스 기능 라이브러리가 다중 대상이 될 수 있습니다.) Microsoft의 플랫폼은 지금 당장 엉망입니다. DLL Hell과 같은 현대적입니다.
McGuireV10

5

간단한 1 줄 수정으로 시작하여 각 문제를 안내하는 멀티 타게팅 넷 프레임 워크 및 넷 코어에 대한 초보자 가이드를 작성했습니다 .

가장 간단한 방법은 먼저 netcore 또는 netstandard 대상을 작동시키는 것입니다. 그런 다음 csproj 파일을 편집하고 다른 대상에 대해 다음 단계를 수행하십시오.

  1. 각 대상에 대해 서로 다른 종속성을 선언 할 수 있도록 csproj 파일의 조건부 섹션에 대해 알아 봅니다. 각 대상에 대한 조건부 섹션을 만듭니다.
  2. <Reference />s빌드 오류 메시지가 누락되었다고 말하는 것을 읽는 것만으로 netframework 대상에 대해 System. * dll을 추가하십시오 .
  3. <PackageReference />s각 대상에 대해 동일하지 않은 경우 NuGet 종속성 을 처리합니다. 가장 쉬운 방법은 GUI가 Nuget 참조를 올바르게 처리 할 수 ​​있도록 일시적으로 단일 대상으로 되 돌리는 것입니다.
  4. 창의적인 다양한 기술, 해결 방법 및 시간 절약 방법을 학습하여 모든 대상에서 컴파일되지 않는 코드를 처리하십시오.
  5. 더 많은 목표를 추가하는 데 드는 비용이 너무 높을 때 손실을 줄여야 할 때를 아십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.