如何检测正在使用的.NET运行时(MS与Mono)?

时间:2009-04-06 12:11:24

标签: c# mono clr

我想知道在程序执行期间是使用Mono运行时还是Microsoft运行时执行它。

我目前正在使用以下代码来确定我是否使用MS CLR:

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

但是,这在某种程度上取决于运行时的安装文件夹,我不确定这是否适用于所有安装。

有没有更好的方法来检查当前的运行时?

5 个答案:

答案 0 :(得分:75)

来自Mono Project的Guide to Porting Winforms Applications

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

我相信你会有更多问题,所以值得查看本指南和mono-forums

答案 1 :(得分:24)

你可以检查Mono Runtime像这样

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

答案 2 :(得分:12)

随着C#6的出现,现在可以将其转换为get-only属性,因此实际检查只进行一次。

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

答案 3 :(得分:9)

只需运行以下代码..

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

答案 4 :(得分:7)

这是我在项目中使用的缓存版本:

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>中,反射调用只发生一次。

相关问题