.NET Core R2クラスライブラリを作成し、いくつかの異なるプラットフォームで使用するいくつかの共通コードがあります。
一部のコードは.NETCoreプラットフォームでは無効なので、条件付きコンパイルシンボルでラップしたいと思います。最初にインターネットを検索して、組み込みの記号(SILVERLIGHT for Silverlight アプリケーションやWINFX_CORE for Windows 8アプリケーションなど)を見つけることができるかどうかを確認しましたが、情報が見つからなかったため、決定しました。自分のシンボルを作成します。これもうまくいかないようです。
私が読んだすべてのことから、記号の追加と使用は簡単なはずです。プロジェクトのプロパティ→ビルドタブの条件付きコンパイルシンボルに値を追加するだけです。私はそれをしました、しかしそれはうまくいかないようです。ここにいくつかのスクリーンショットがあります...
条件付きコンパイルシンボルにNET_CORE
値を追加しましたが、コードで使用すると、コードが無視されないことに注意してください。
.NET Coreプラットフォーム(私はR2を使用しています)の組み込みシンボルはありますか?
シンボルがない場合、自分のシンボルを作成するのに何が間違っているのでしょうか。
.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>
UPDATE:提供された回答のリンクを使用してこれを解決することができました。詳細はこちら...
元々、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" ]
}
}
}
}
条件変数は、RC2のproject.jsonファイルで定義する必要があります。ここにサンプルプロジェクトがあります。
しかし、この記事から事前定義されたものもあります、
Xprojは廃止されたため、新しいVisual Studio 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
// Full framework
#endif
}
できるよ:
private TypeInfo GetTypeInfo(Type type)
{
#if NET_CORE
// Core
#else
// Fullframework
#endif
}
マルチターゲティングの詳細については、こちらをご覧ください:クロスプラットフォームツールを使用したライブラリの開発、マルチターゲティングの方法
.NET Corexprojプロジェクトタイプにバグがあります。プロジェクト設定で条件付きコンパイルシンボルを定義すると、要素が「定義」として定義されますが、これは正しくありません。 「define」という要素を作成する必要があります。 project.jsonを手動で編集することで、この問題を回避できます。
私はこのバグを2か所でMicrosoftに記録しました。時間をかけてMicrosoftに迷惑を登録してください。そうすれば、Microsoftは最終的にそれを修正し、他の人にこの悲しみを引き起こさないようになります。
このスレッドには、再現手順とスクリーンショットに関する問題の詳細な説明があります: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946
これはMicrosoftConnectのバグレポートです: https://connect.Microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs