.Net核心类库

时间:2016-06-26 16:10:51

标签: c# conditional-compilation .net-core-rc2

我创建了一个.Net Core R2类库,它有一些我用于几个不同平台的常用代码。某些代码在.Net Core平台中无效,因此我希望将其包含在条件编译符号中。我首先搜索了互联网,看看我是否能找到内置符号(如Silverlight应用程序的SILVERLIGHT和Windows 8应用程序的WINFX_CORE),但无法找到任何信息,所以我决定创建自己的符号。这似乎也不起作用。

从我阅读的所有内容中添加和使用符号应该很简单,只需在项目属性中添加一个值条件编译符号即可。构建标签。我做到了,但似乎确实有效。这里有几个屏幕截图......

enter image description here

enter image description here

请注意,我在条件编译符号中添加了NET_CORE值,但是当我在代码中使用它时,代码不会被忽略。

1)是否有人知道.Net Core平台是否有内置符号(我使用的是R2)?

2)如果没有,我在创建自己的符号时做错了什么?

.xproj文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
  <PropertyGroup Label="Globals">
    <ProjectGuid>253184d7-9b42-4233-a871-8cfa3ee9e83e</ProjectGuid>
    <RootNamespace>Linq2Db.NetCore</RootNamespace>
    <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
    <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>
  <PropertyGroup>
    <SchemaVersion>2.0</SchemaVersion>
  </PropertyGroup>
  <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>



更新:我可以使用提供的答案中的链接解决此问题。这是详细信息......

最初project.json文件看起来像这样......

{
  "dependencies": {
        "NETStandard.Library": "1.5.0-rc2-24027"
  },
  "frameworks": {
    "netstandard1.5": {
      "imports": "dnxcore50"
    }
  },
  "buildOptions": {
    "defines": [ "NET_CORE" ]
  }
}

我通过将其更改为此问题解决了这个问题......

{
  "frameworks": {
    "netstandard1.5": {
      "imports": "dnxcore50",
      "dependencies": {
        "NETStandard.Library": "1.5.0-rc2-24027"
      },
      "buildOptions": {
        "define": [ "NET_CORE" ]
      }
    }
  }
}

2 个答案:

答案 0 :(得分:9)

自从xproj停产以来,这是在新的VS 2017 csproj中完成的方式。

<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.3' Or '$(TargetFramework)' == 'netstandard1.6' ">
    <DefineConstants>NET_CORE</DefineConstants>
</PropertyGroup>

然后代替:

private TypeInfo GetTypeInfo(Type type)
{
#if NETSTANDARD1_3 || NETSTANDARD1_6
      //core
#else
      //fullframework
#endif
 }

你可以这样做:

private TypeInfo GetTypeInfo(Type type)
{
#if NET_CORE
      //core
#else
      //fullframework
#endif
 }

有关多目标定位的详细信息,请参阅此处:https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget

答案 1 :(得分:4)

条件变量应该在RC2的project.json文件中定义,我这里有一个示例项目,

https://blog.lextudio.com/2016/06/port-snmp-from-net-core-rc1-to-rc2/

但是本文还有预定义的

https://github.com/dotnet/core-docs/blob/master/docs/core/tutorials/libraries.md#how-to-multitarget