web-dev-qa-db-ja.com

使用されている.NETランタイム(MSとMono)を検出する方法は?

プログラムの実行中に、MonoランタイムとMicrosoftランタイムのどちらを使用して実行されているのか知りたいのですが。

現在、次のコードを使用して、MSCLRを使用しているかどうかを確認しています。

static bool IsMicrosoftCLR()
{
    return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft");
}

ただし、これはランタイムのインストールフォルダーにいくらか依存しており、これがすべてのインストールで機能するかどうかはわかりません。

現在のランタイムを確認するためのより良い方法はありますか?

46
Dirk Vollmar

Monoプロジェクトの Winformsアプリケーションの移植ガイド

public static bool IsRunningOnMono ()
{
    return Type.GetType ("Mono.Runtime") != null;
}

もっとたくさんの質問があると思いますので、このガイドと mono-forums をチェックする価値があります

75
Mystic

このようにMonoランタイムをチェックできます

bool IsRunningOnMono = (Type.GetType ("Mono.Runtime") != null);
24
Alex

C#6の登場により、これをget-onlyプロパティに変換できるようになったため、実際のチェックは1回だけ実行されます。

internal static bool HasMono { get; } = Type.GetType("Mono.Runtime") != null;
12
RobinHood70

以下のコードを実行するだけです。

static bool IsMicrosoftCLR()
{
    return (Type.GetType ("Mono.Runtime") == null)
}
9
Binoj Antony

これが私のプロジェクトで使用しているキャッシュ付きのバージョンです:

public static class PlatformHelper
{
    private static readonly Lazy<bool> IsRunningOnMonoValue = new Lazy<bool>(() =>
    {
        return Type.GetType("Mono.Runtime") != null;
    });

    public static bool IsRunningOnMono()
    {
        return IsRunningOnMonoValue.Value;
    }
}

@ahmet alp balkanが述べたように、これを頻繁に呼び出す場合は、ここでキャッシュが役立ちます。 Lazy<bool>でラップすることにより、リフレクション呼び出しは1回だけ発生します。

7
Nate Barbettini