如何检测正在使用哪个 .NET 运行时(MS 与 Mono)?
Posted
技术标签:
【中文标题】如何检测正在使用哪个 .NET 运行时(MS 与 Mono)?【英文标题】:How to detect which .NET runtime is being used (MS vs. Mono)? 【发布时间】:2010-10-17 19:05:29 【问题描述】:我想在程序执行期间知道它是使用 Mono 运行时还是 Microsoft 运行时执行的。
我目前正在使用以下代码来确定我是否在 MS CLR 上:
static bool IsMicrosoftCLR()
return RuntimeEnvironment.GetRuntimeDirectory().Contains("Microsoft");
但是,这在某种程度上取决于运行时的安装文件夹,我不确定这是否适用于所有安装。
有没有更好的方法来检查当前运行时?
【问题讨论】:
【参考方案1】:来自 Mono 项目的 Guide to Porting Winforms Applications:
public static bool IsRunningOnMono ()
return Type.GetType ("Mono.Runtime") != null;
我相信您会有更多问题,因此值得查看本指南和mono-forums
【讨论】:
您可能还想保存(缓存)结果,每次调用反射可能会很昂贵。 是否也可以检测 dotnet-runtime,还是 Mono 也可以?【参考方案2】:你可以像这样检查 Mono 运行时
bool IsRunningOnMono = (Type.GetType ("Mono.Runtime") != null);
【讨论】:
【参考方案3】:随着 C# 6 的出现,现在可以将其转换为 get-only 属性,因此实际检查只进行一次。
internal static bool HasMono get; = Type.GetType("Mono.Runtime") != null;
【讨论】:
【参考方案4】:只需运行以下代码..
static bool IsMicrosoftCLR()
return (Type.GetType ("Mono.Runtime") == null)
【讨论】:
“Mono 不是运行时”并不意味着“MS CLR 是运行时”【参考方案5】:这是我在项目中使用的带有缓存的版本:
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>
中,反射调用只发生一次。
【讨论】:
以上是关于如何检测正在使用哪个 .NET 运行时(MS 与 Mono)?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone - 如何在运行时检测到设备正在运行我的应用程序的临时构建
如何区分 MS Access 完整版和 Access 运行时