如何为Windows Forms应用程序项目定位多个框架?

时间:2019-06-17 16:11:18

标签: c# .net visual-studio

我想知道如何编辑Windows窗体应用程序项目以使其能够针对多个框架版本,并使用#if语句来控制代码流,具体取决于用户使用的代码。

整个互联网上都有答案-大概几十个或数百个。它们似乎都不适合我的项目,它们都提到了我项目中不存在的代码块-例如“ TargetFramework”标签

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <RootNamespace>WindowsFormsApp1</RootNamespace>
    <AssemblyName>WindowsFormsApp1</AssemblyName>
    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <IsWebBootstrapper>false</IsWebBootstrapper>
    <TargetFrameworkProfile />
    <PublishUrl>C:\Users\Hansens\Desktop\</PublishUrl>
    <Install>true</Install>
    <InstallFrom>Disk</InstallFrom>
    <UpdateEnabled>false</UpdateEnabled>
    <UpdateMode>Foreground</UpdateMode>
    <UpdateInterval>7</UpdateInterval>
    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
    <UpdatePeriodically>false</UpdatePeriodically>
    <UpdateRequired>false</UpdateRequired>
    <MapFileExtensions>true</MapFileExtensions>
    <ApplicationRevision>2</ApplicationRevision>
    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
    <UseApplicationTrust>false</UseApplicationTrust>
    <PublishWizardCompleted>true</PublishWizardCompleted>
    <BootstrapperEnabled>true</BootstrapperEnabled>
  </PropertyGroup>

这是我的csproj文件中的一些数据-我还没有找到如何编辑“ TargetFrameworkVersion”标签来容纳多个框架引用,而整个cproj中的任何地方都没有“ Project Sdk =“ Microsoft.NET.Sdk”标签即使在每个地方都引用了它,所以由于它看起来与其他人不太相似,所以我没有一个很好的起点-这里有任何建议吗?

2 个答案:

答案 0 :(得分:1)

您不能将现有的.NET Framework Windows Forms项目用作包含多个.NET Framework Target Framework Moniker的项目,或者通常称为TFM。

要具有正确的多个TFM,必须使用.NET Core SDK样式项目(而不是.NET Framework Windows Forms项目模板)来使用.NET Core SDK样式项目。这些更新的.NET Core SDK项目模板始终具有* proj的第一行,以将标记标记为相关的.NET SDK。

要具有多个.NET TFM,请在属性组中使用此<TargetFrameworks>标记。 TFM由分号分隔。

例如:

  <PropertyGroup>
     <TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
  </PropertyGroup>

Eben的回答很好,但是应该清楚地提到项目模板类型的差异,而这与csproj根本无关。

此SDK项目模板是.NET Core SDK区分所有受支持模板(例如普通/通用类库/控制台)与其他主要目标(例如ASP.NET Core SDK项目模板)之间的项目模板的方式以及即将推出的.NET Core Windows Forms / WPF SDK。

例如,.NET Core F#,C#,VB项目具有以下内容:

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

对于ASP.NET Core,该项目具有以下功能:

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

因此,您首先必须关注SDK,然后是最终生成的二进制文件和所需的TFM。

答案 1 :(得分:0)

如今,csproj文件有2种格式。如果要显示,则显示“传统”版本,然后显示较新的“ sdk”版本。我碰巧有一个较旧的软件包,尚未更新为针对多个框架版本的较新版本。 csproj file包含一些条件处理,而构建各种版本的msbuild file则涉及一些技巧。它应该是不言自明的。主要问题是您需要对文件进行一些手动编辑。

获得较新版本的最简单方法是创建一个新的.net核心项目。之后,您可以编辑csproj file的较新版本,甚至可以定位整个.net框架。 msbuild file稍微简单一点,因为框架本身可以处理多个版本。代替了多个版本的TargetFramework标签,而不是TargetFrameworks标签。

您只需要定位受支持的最低版本,因为其余版本应该可以。您甚至可以只针对.net标准。我的目标是.net 4.6.1,.net标准2.0和.net core 2.1,因为我在解决.net标准专用软件包时遇到了问题。也许将来会改变。