【问题标题】:How to detect which .NET runtime is being used (MS vs. Mono)?如何检测正在使用哪个 .NET 运行时(MS 与 Mono)?
【发布时间】:2010-10-17 19:05:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# mono clr


    【解决方案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; 中,反射调用只发生一次。

        【讨论】:

          猜你喜欢
          • 2012-11-05
          • 1970-01-01
          • 2021-03-25
          • 1970-01-01
          • 2019-04-01
          • 2020-02-23
          • 2013-12-14
          • 2012-06-23
          • 2016-05-04
          相关资源
          最近更新 更多