使用条件编译

时间:2017-03-09 17:42:23

标签: c# .net-core .net-standard-1.6

我正在使用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在库中
  1. ,添加条件引用到XSDL库。在这个例子中,我引用了一个.NET462包装器:

    <ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
        <Reference Include="TheLibUsingXSDL">
            <HintPath>..\Lib\TheLibUsingXSDL.dll</HintPath>
        </Reference>
    </ItemGroup>
    
  2. 似乎拥有多个目标框架并不足以在项目中获得编译常量,因为编辑器会使库中的所有.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提要中。

  3. 然后我创建了一个针对.NET核心和.NET462的.NET核心控制台应用程序,并从我的本地feed添加了这个包。在那里,使用基于XSDL的功能的代码也必须是有条件的,所以我也将上面的属性组添加到控制台应用程序项目中。

  4. 然而,当我尝试在控制台应用程序中编译此代码时,我得到类型未找到编译错误。有人可以帮忙吗?也许我只是遗漏了一些明显的东西,但VS2017相当新,所以它的csproj格式。我的csproj文件的基本部分如下。

    1. 使用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>
      
    2. 消费者控制台.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>
      

0 个答案:

没有答案