1

まず、はい、私はこれらの投稿を見ました:
OSバージョンに基づく条件付きコンパイルシンボルを
C#のフレームワークバージョンに応じて条件付き
コンパイルする簡単な方法はあり ますが、それらは私が探している方向を対象としていません。

私が具体的に探しているのは、OSバージョンによる変数_type_修飾です。

public struct REPASTESPECIAL
{
     UInt32   dwAspect;
#if WINVER >= 6.0
     UIntPtr  dwParam;
#else
     UInt32   dwParam;
#endif 
}

私はこのようなものに戻りたくありません:

public struct REPASTESPECIAL<T>
{
     UInt32     dwAspect;
     T dwParam;
}
// return type by OS version
public static Type GetRePasteSpecial_ParamType()
{
    if (Environment.OSVersion.Version.Major >= 5) return typeof(IntPtr);
    else return typeof(UInt32);
}

...これにより、プログラマーは、dwParamをIntPtrまたはUInt32オブジェクトのみにしたい場合に、タイプTの任意のオブジェクトを使用できますが、そうする必要がある場合は、これを参照して、同じものを探している他のユーザーを参照してください。

4

2 に答える 2

3

いいえ-条件付きコンパイルはコンパイル時に機能しますが、実行時に機能するものを探しているように見えます。

編集:考えてみると、ある意味で条件付きコンパイルを使用できます。これを可能な限り独自のアセンブリにカプセル化し、2つの方法でコンパイルして、2つの別々のアセンブリを生成できます。次に、インストール時に(または何でも)適切なアセンブリをインストールします。ただし、作成しているアプリの種類を知らなければ、それがどれほど実現可能かを知ることは困難です。

于 2012-06-01T18:58:09.190 に答える
2

回答:「他の人に公開すると誤用されるのではないかと心配している醜い論理があります」

誤用を許さない、使いやすいAPIを公開することを検討してください。すべての相互運用型を内部クラスおよび実装の構造として宣言します。優れたAPIの場合、REPASTESPECIALのような最も内部のクラスを公開/使用可能にする価値はあまりありません。

このようにして、醜いクラス/構造体タイプを非表示にし、必要に応じてOS固有の実装を動的に選択できます。

この教育プロジェクトの場合、実行時に正しい実装を構成するための依存性注入について学ぶのに適した場所です。

于 2012-06-01T20:48:28.107 に答える