[英]Can I use a project targetting .NET Framework as a dependency of another a project targetting .NET Core?
[英]Targetting multiple .net framework versions by using different project configurations
我有一个项目,我需要建立两种不同的配置。 一个配置将针对.net框架3.5,另一个配置将针对.net框架4.0。 首先是可能的吗? 我创建了一个名为DotNet35的新配置(使用通常的步骤),它将以.net 3.5为目标。 我已经通过将创建的项目配置中的目标版本指定为v3.5来完成此操作。它似乎不起作用。 知道为什么吗? 这是我的.csproj中的属性组部分(只有手动添加是TargetFrameworkVersion元素)
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DotNet35|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\DotNet35\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<PlatformTarget>AnyCPU</PlatformTarget>
<CodeAnalysisLogFile>..\..\bin\Client\Debug\CS.XRAY.XRayClient.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
<CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
<CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
</PropertyGroup>
你所做的应该有效,尽管Visual Studio会在你的项目设置中显示错误的“目标框架”。
根据我的经验,可以通过手动修改项目文件(.csproj)在单个项目中定位多个.NET框架版本。
假设您已经拥有.NET 4配置,并且想要创建.NET 3.5配置。 做这个:
在Visual Studio中,根据现有的“调试”和“发布”配置,创建两个新的解决方案配置(在Configuration Manager中),其名称如“Debug.Net35”和“Release.Net35”。 告诉VS“创建新项目配置”。 然后保存您的项目并退出Visual Studio。
在文本编辑器(而不是VS)中编辑每个项目文件。 查找引用新.Net35配置的所有PropertyGroup
元素,例如:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release.Net35|AnyCPU'">
在该行下面添加一个TargetFrameworkVersion
元素:
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
请记住 :您通常需要更改2-4个PropertyGroup。 为了更好地衡量,您可能还想为原始配置添加<TargetFrameworkVersion>
,但这是可选的,因为原始<TargetFrameworkVersion>
将从非限定<ProjectGroup>
元素继承。
您可能需要添加一个.NET框架版本中存在的引用,而不是另一个。 例如,您可能使用System.Core.dll,但仅限于.NET 3.5及更高版本,以及WindowsBase.dll,但.NET 2.0除外。 您可以通过在项目文件中创建特殊引用来完成此操作:
<ItemGroup Condition="'$(TargetFrameworkVersion)'!='v2.0'"> <Reference Include="WindowsBase" /> </ItemGroup> <ItemGroup Condition="'$(TargetFrameworkVersion)'!='v2.0' And '$(TargetFrameworkVersion)'!='v3.0'"> <Reference Include="System.Core" /> </ItemGroup>
或者您可以使用Theraot的.NET兼容性DLL ,但仅限于.NET 3.5及更早版本,例如:
<ItemGroup Condition="'$(TargetFrameworkVersion)'=='v3.5' Or '$(TargetFrameworkVersion)'=='v3.0' Or '$(TargetFrameworkVersion)'=='v2.0'"> <Reference Include="Theraot.Core"> <HintPath>..\\Lib\\Theraot.Core.dll</HintPath> </Reference> </ItemGroup>
我相信ItemGroup
元素应该是Project
的子元素,而不是现有ItemGroup
的子元素。
Visual Studio会表现得有些奇怪。 更改配置时,项目设置中显示的“目标框架”将始终保持不变。 例如,当您使用“添加引用”时,列出的引用将基于默认的 .NET框架版本,而不是当前配置指定的当前版本。
我不认为你可以通过同一个项目的多个配置来做到这一点。
但是,您可以通过拥有多个项目文件来实现这一目标,每个项目都针对不同的框架版本。
编辑:最简单的方法,顺便说一下,只需复制您当前的项目文件,打开它,并更改目标框架版本。
您可能不需要这样做......理论上,它只需要一个简单的配置文件来使.NET 3.5应用程序针对.NET 4运行。 这可能比使用两个单独的构建更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.