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

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

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

여기에 이미지 설명 입력



답변

수동으로 편집하여 프로젝트 파일 및 추가 필요 기본에 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>


답변

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

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

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


답변

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

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

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

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


답변

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

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

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


답변