それは条件付きでの.NET Frameworkのバージョンにコンパイルすることは可能ですか?
-
11-09-2019 - |
質問
私はMFCで作業するときに_MFC_VER
マクロをチェックすることにより、MFCフレームワークの複数のバージョンをサポートすることができ、バック呼び出すことができます。
私は、.NET 4と今いくつかのものをやっているし、スポットのカップルでタプルを使用しますが、それでも3.5互換の他のすべてを維持したいと思います。
私のような何かを探しています:
#if DOTNET4
public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
解決
あなたが使用することができます何の組み込みプリコンパイラ定数はありません。しかし、十分にそれぞれの構成は、ターゲットフレームワークのバージョン定義された定数の、そしてもちろんの独自のセットを持ってVSで独自のビルド構成を作成する簡単です。多くの人々は、条件付きでベースの32ビットまたは64ビットの違いをコンパイルするためにこれを行います。
他のヒント
(理論的には、またはの.vbproj)あなたの.csprojでカスタムコンパイルシンボルを定義するときに注意すべき一つの大きな注意点があります:彼らはすべての以前に定義されたコンパイルシンボルを上書きします。例えば、MSBuildのスニペットを考えてみます:
<PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
<DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
</PropertyGroup>
<PropertyGroup>
<DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
</PropertyGroup>
第DefineConstants要素は、その値が示唆するように、DefineConstantsの最初の値を壊します。これを避けるために、あなたはこのように見えるために、第2 DefineConstants要素を書き換えることになるでしょう。
<DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>
また、あなたが定義したPropertyGroupのこの内部を配置することをお勧めします。の後にの他のすべてのPropertyGroupsは、Visual Studio 2010には、現在、それは他のカスタムを壊しますようにカスタムコンパイルシンボルに追加されますようそれらが配置されている場合Visual Studioは、その定義をダウンplops前に、ユーザーが定義したコンパイルシンボル。私はマイクロソフトでこの問題を提起してきました。あなたは<のhref = "http://connect.microsoft.com/VisualStudio/feedback/details/596694/visual-studios-default-mechanism-of-defining-custom-compilation-symbols-clobbers-anyでその進捗状況を追跡することができます - その他 - 事前定義されたコンパイル・シンボル」のrel = 『noreferrer』タイトル= 『マイクロソフト接続』>マイクロソフト接続するます。
サイドノートでは、あなたの条件付きコンパイルコードは、それが発生したプログラマーを挫折されます。
の編集、コメントに基づいての
それはあなたがそれを行うには何が起こっているかを保証することができ、あなたが任意の奇妙な署名や相続の問題を持っていないので、独自のクラスを記述することはおそらく良いでしょう。
public class Pair<TSource, TResult>
{
public TSource Source { get; set; }
public TResult Result { get; set; }
public Pair() {}
public Pair(TSource source, TResult result)
{
Source = source;
Result = result;
}
// Perhaps override Equals() and GetHashCode() as well
}
いつものように、それはあなた自身のコードを展開する対内蔵のものを使用して比較検討することが良いことです。一般的にそれは、あなた自身に尋ねる意味「アムI OKを維持し、このコードをサポートしています?」対「コードは箱から出して、私はそれが必要なのか?」
):あなたがTuple<T1, T2>
を持つことが保証していないので、他の開発者が簡単に呼吸できるように、この場合、私はちょうどあなた自身のシンプルなものを書きたいです
を
classname.cs 公共部分クラス名{...}
classname.40.cs 公共部分クラス名{ 公共タプルのsomeMethod(){...} }
classname.35.cs 公共部分クラス名{ 公共KeyValuePairのsomeMethod(){...} }