Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测正在使用的.NET运行时(MS与Mono)?_C#_Mono_Clr - Fatal编程技术网

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

C# 如何检测正在使用的.NET运行时(MS与Mono)?,c#,mono,clr,C#,Mono,Clr,我想知道在程序执行期间,它是使用Mono运行时还是Microsoft运行时执行的 我当前正在使用以下代码确定我是否在MS CLR上: static bool IsMicrosoftCLR() { return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft"); } 但是,这在某种程度上取决于运行时的安装文件夹,我不确定这是否适用于所有安装 是否有更好的方法检查当前运行时 您可以像这样检查Mono运行时 bool

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

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

static bool IsMicrosoftCLR()
{
    return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft");
}
但是,这在某种程度上取决于运行时的安装文件夹,我不确定这是否适用于所有安装


是否有更好的方法检查当前运行时

您可以像这样检查Mono运行时

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

只需运行下面的代码

static bool IsMicrosoftCLR()
{
    return (Type.GetType ("Mono.Runtime") == null)
}
来自Mono项目的:

我相信您会有更多的问题,因此值得查看本指南和

随着C#6的出现,现在可以将其转换为仅获取属性,因此实际检查只需执行一次

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

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

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;
    }
}
公共静态类PlatformHelper
{
private static readonly Lazy isrunningnovalue=new Lazy(()=>
{
返回Type.GetType(“Mono.Runtime”)!=null;
});
公共静态bool正在运行nmono()
{
返回值为runningnovalue.Value;
}
}

正如@ahmet alp balkan所提到的,如果您经常调用缓存,那么这里的缓存非常有用。通过将其包装为一个惰性,反射调用只会发生一次。

您可能还想保存(缓存)结果,每次调用反射可能会很昂贵。是否也可以检测dotnet运行时,或者Mono也是这样?“Mono不是运行时”并不意味着“MS CLR是运行时”
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;
    }
}