我正在使用VS2017(RTM)将旧版.NET 4.6.2库迁移到新的.NET Core框架(适用于.NET Standard 1.6)。该库应该由.NET Core和.NET462客户端使用,因此其.csproj文件针对两个框架,例如: (注意复数标签):
<TargetFrameworks>netstandard1.6;net462</TargetFrameworks>
我唯一的问题是某些代码使用XML模式验证;这在.NET Core中不可用。 AFAIK经过第一段不确定性(见http://xmlprime.blogspot.it/2016/07/net-core-and-state-of-xml.html)之后,从XSD/Schema validation workaround in .net core?这样的后期帖子看来它似乎即将到来,但同时我必须继续,至少在.NET462环境中支持它。解决方案应该很简单:
,添加条件引用到XSDL库。在这个例子中,我引用了一个.NET462包装器:
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
<Reference Include="TheLibUsingXSDL">
<HintPath>..\Lib\TheLibUsingXSDL.dll</HintPath>
</Reference>
</ItemGroup>
似乎拥有多个目标框架并不足以在项目中获得编译常量,因为编辑器会使库中的所有.NET 462代码变灰。我在定位.NET 462时需要NET462
,因此我可以在#if NET462
... #endif
指令中包含与XSDL相关的代码。为此,在谷歌搜索后我发现了这个文档:https://docs.microsoft.com/en-us/dotnet/articles/core/tools/project-json-to-csproj。它并不完全涵盖我的情况,但我尝试了一些猜测,似乎有效:
<PropertyGroup Condition=" '$(TargetFramework)' == 'net462' ">
<DefineConstants>$(DefineConstants);NET462</DefineConstants>
</PropertyGroup>
现在.NET 462代码不再灰显,项目编译。我可以创建一个包,并将其存储在我自己的本地NuGet提要中。
然后我创建了一个针对.NET核心和.NET462的.NET核心控制台应用程序,并从我的本地feed添加了这个包。在那里,使用基于XSDL的功能的代码也必须是有条件的,所以我也将上面的属性组添加到控制台应用程序项目中。
然而,当我尝试在控制台应用程序中编译此代码时,我得到类型未找到编译错误。有人可以帮忙吗?也许我只是遗漏了一些明显的东西,但VS2017相当新,所以它的csproj格式。我的csproj文件的基本部分如下。
使用XSDL(上面示例中为TheLibUsingXSDL
)的库是一个完整的.NET 4.6.2库。另一个包含多个目标的.NET Core库包装它,这个库由消费者控制台应用程序引用。它的csproj就像:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.6;net462</TargetFrameworks>
<NetStandardImplicitPackageVersion>1.6.1</NetStandardImplicitPackageVersion>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<Version>1.0.3</Version>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
<Reference Include="TheLibUsingXSDL">
<HintPath>..\Lib\TheLibUsingXSDL.dll</HintPath>
</Reference>
</ItemGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net462' ">
<DefineConstants>$(DefineConstants);NET462</DefineConstants>
</PropertyGroup>
</Project>
消费者控制台.NET Core app csproj就像:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp1.1;net462</TargetFrameworks>
<RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp1.6' ">1.1.1</RuntimeFrameworkVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="TheLibUsingXSDL" Version="1.0.3" />
<PackageReference Include="Microsoft.Extensions.CommandLineUtils" Version="1.1.0" />
<PackageReference Include="NLog" Version="5.0.0-beta06" />
</ItemGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net462' ">
<DefineConstants>$(DefineConstants);NET462</DefineConstants>
</PropertyGroup>
</Project>