2009-04-06 19 views
40

Mi piacerebbe sapere durante l'esecuzione di un programma se viene eseguito utilizzando il runtime Mono o il runtime Microsoft.Come rilevare quale runtime .NET viene utilizzato (MS vs Mono)?

Attualmente sto usando il seguente codice per determinare se sono su un MS CLR:

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

Tuttavia, questo è un po 'dipende dalla cartella di installazione del runtime e io non sono sicuro se questo funzionerà su tutte le installazioni.

C'è un modo migliore per verificare il runtime corrente?

risposta

69

Dalla Guide to Porting Winforms Applications del Progetto Mono:

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

Sono sicuramente avrai molte più domande, quindi vale la pena controllare questa guida e lo mono-forums

+0

Grazie per i buoni suggerimenti. –

+5

Si potrebbe desiderare di salvare (cache) anche il risultato, chiamare la riflessione ogni volta potrebbe essere costoso. –

21

È possibile verificare la presenza di Mono Runtime Ti piace questa

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

basta eseguire il codice seguente ..

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

Con l'avvento del C# 6, questo può ora essere trasformato in una proprietà get-only, quindi il controllo effettivo viene eseguito una sola volta.

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

Ecco una versione con caching che sto usando nel mio progetto:

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

Come @ahmet balkan alp accennato, la cache è utile qui se stai chiamando questo frequentemente. Se lo si avvolge in un Lazy<bool>, la chiamata di riflessione viene eseguita solo una volta.

Problemi correlati