Как определить, какая среда выполнения .NET используется (MS против Mono)? - PullRequest
46 голосов
/ 06 апреля 2009

Я хотел бы знать во время выполнения программы, выполняется ли она с использованием среды Mono или Microsoft.

В настоящее время я использую следующий код, чтобы определить, нахожусь ли я в MS CLR:

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

Однако это в некоторой степени зависит от установочной папки среды выполнения, и я не уверен, будет ли это работать на всех установках.

Есть ли лучший способ проверить текущее время выполнения?

Ответы [ 5 ]

75 голосов
/ 06 апреля 2009

Из руководства Mono Project по переносу приложений Winforms :

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

Я уверен, что у вас будет гораздо больше вопросов, поэтому стоит проверить это руководство и монофорумы

24 голосов
/ 06 апреля 2009

Вы можете проверить Mono Runtime, как это

bool IsRunningOnMono = (Type.GetType ("Mono.Runtime") != null);
12 голосов
/ 15 августа 2015

С появлением C # 6 это теперь можно превратить в свойство только для получения, поэтому фактическая проверка выполняется только один раз.

internal static bool HasMono { get; } = Type.GetType("Mono.Runtime") != null;
9 голосов
/ 06 апреля 2009

просто запустите приведенный ниже код ..

static bool IsMicrosoftCLR()
{
    return (Type.GetType ("Mono.Runtime") == null)
}
7 голосов
/ 18 августа 2015

Вот версия с кэшированием, которую я использую в своем проекте:

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>, вызов отражения происходит только один раз.

...