我想知道如何编辑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”标签即使在每个地方都引用了它,所以由于它看起来与其他人不太相似,所以我没有一个很好的起点-这里有任何建议吗?
答案 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标准专用软件包时遇到了问题。也许将来会改变。