在MSBuild项目中使用.net核心SDK

问题描述

我有一个PCL项目,每个平台的功能和类都不同。我现在想实现.net核心支持。但是我无法使用UserControl之类的控件,因为未引用Microsoft.NET.Sdk.WindowsDesktop SDK。 .net框架易于实现,因为我只需要引用每个程序集...但是在.net核心中,我不能引用该程序集...

<Project Sdk="MSBuild.Sdk.Extras">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;xamarin.ios10;xamarin.mac20;xamarin.tvos10;monoAndroid10.0;tizen40</TargetFrameworks>
    <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">uap10.0.17763;net472;netcoreapp3.1;$(TargetFrameworks)</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition=" $(TargetFramework.StartsWith('net4')) And '$(OS)' == 'Windows_NT' ">
    ...
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="System.Xaml" />
  </ItemGroup>

  <ItemGroup Condition=" $(TargetFramework.StartsWith('netcoreapp3')) And '$(OS)' == 'Windows_NT' ">
    ...
    <SDKReference Include="Microsoft.NET.Sdk.WindowsDesktop" />
  </ItemGroup>

那是我的可执行应用,引用了上面的PCL项目;

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference ...... />
  </ItemGroup>

</Project>

我已经尝试过引用SDK,但无法正常工作。

 <SDKReference Include="Microsoft.NET.Sdk.WindowsDesktop" />

enter image description here

解决方法

我现在想实现.net核心支持。但是我不能使用控件 之所以喜欢UserControl,是因为Microsoft.NET.Sdk.WindowsDesktop SDK 没有被引用。 .net框架易于实现,因为我 只需要引用每个程序集...但是在.net核心中,我不能 引用程序集。

经过深入研究,我发现 SDKReference 无法使用Microsoft.NET.Sdk.WindowsDesktop

作为建议,您可以创建一个自定义目标文件,然后将其导入到您的 PCL项目中以使用Net Core SDK。

1)在您的 PCL 项目文件夹中创建一个名为custom.targets的文件。

2),然后将其添加到custom.targets

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

    <PropertyGroup>         
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <UseWPF>true</UseWPF>
    </PropertyGroup>

</Project>

3)将其导入到 PCL项目xxx.csproj文件中。

<Import  Project="$(ProjectDir)custom.targets" Condition=" $(TargetFramework.StartsWith('netcoreapp3')) And '$(OS)' == 'Windows_NT' "/>

4),然后重新启动项目。尽管有些警告提醒您某些sdk被重复引用,但是您可以忽略它们,并且对您的项目没有任何影响。

您可以检查一下,对我来说效果很好。

enter image description here