我创建了一个.Net Core R2类库,它有一些我用于几个不同平台的常用代码。某些代码在.Net Core平台中无效,因此我希望将其包含在条件编译符号中。我首先搜索了互联网,看看我是否能找到内置符号(如Silverlight应用程序的SILVERLIGHT和Windows 8应用程序的WINFX_CORE),但无法找到任何信息,所以我决定创建自己的符号。这似乎也不起作用。
从我阅读的所有内容中添加和使用符号应该很简单,只需在项目属性中添加一个值条件编译符号即可。构建标签。我做到了,但似乎确实有效。这里有几个屏幕截图......
请注意,我在条件编译符号中添加了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" ]
}
}
}
}
答案 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