如何检测正在使用哪个 .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&lt;bool&gt; 中,反射调用只发生一次。

【讨论】:

以上是关于如何检测正在使用哪个 .NET 运行时(MS 与 Mono)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# .NET 中检测应用程序池重新启动?

使用多个 AVPlayer 时如何检测哪个视频结束了?

iPhone - 如何在运行时检测到设备正在运行我的应用程序的临时构建

如何区分 MS Access 完整版和 Access 运行时

如何确定我的 .NET Windows Forms 程序在哪个监视器上运行?

在运行 ASP.NET 的网站中,如何显示存储在 MS Access 2007 附件类型中的图像