2009-04-06 6 views
40

Me gustaría saber durante la ejecución de un programa si se está ejecutando utilizando el tiempo de ejecución Mono o el tiempo de ejecución de Microsoft.¿Cómo detectar qué tiempo de ejecución de .NET se está utilizando (MS vs Mono)?

Actualmente estoy usando el siguiente código para determinar si estoy en un MS CLR:

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

Sin embargo, esto es algo dependiente de la carpeta de instalación del tiempo de ejecución y no estoy seguro de si esto funcionará en todas las instalaciones.

¿Existe alguna forma mejor de verificar el tiempo de ejecución actual?

Respuesta

69

De Guide to Porting Winforms Applications del proyecto Mono:

public static bool IsRunningOnMono() 
{ 
    return Type.GetType ("Mono.Runtime") != null; 
} 

estoy Seguro que tendrás muchas más preguntas, así que vale la pena consultar esta guía y el mono-forums

+0

Gracias por los buenos consejos. –

+5

Es posible que desee guardar (caché) el resultado también, llamar a la reflexión cada vez puede ser costoso. –

21

Puede comprobar el tiempo de ejecución Mono gusta esta

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

basta con ejecutar el código de abajo ..

static bool IsMicrosoftCLR() 
{ 
    return (Type.GetType ("Mono.Runtime") == null) 
} 
5

Con la llegada de C# 6, ahora se puede convertir en una propiedad de solo obtención, por lo que la comprobación real solo se realiza una vez.

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

Aquí hay una versión con el caché que estoy usando en mi proyecto:

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; 
    } 
} 

Como @ahmet Balkan Alp mencionado, el almacenamiento en caché es útil en este caso si usted está llamando a esta frecuencia. Al envolverlo en un Lazy<bool>, la llamada de reflexión solo ocurre una vez.

Cuestiones relacionadas