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