2009-04-06 5 views
40

프로그램 실행 중에 Mono 런타임 또는 Microsoft 런타임을 사용하여 실행되는지 여부를 알고 싶습니다.어떤 .NET 런타임이 사용되고 있는지 (MS vs. Mono) 어떻게 탐지합니까?

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

그러나 이것은 런타임의 설치 폴더에 다소 의존 내가 있는지 확실하지 않다 : 나는 현재 내가 MS CLR에있어 여부를 확인하려면 다음 코드를 사용하고

이것은 모든 설치에서 작동합니다.

현재 런타임을 확인하는 더 좋은 방법이 있습니까? 그냥 아래의 코드를 실행이

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

답변

69

:

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

난 이 가이드와 mono-forums을 확인할 가치가 있으므로 더 많은 질문이있을 것입니다.

+0

좋은 포인터를 가져 주셔서 감사합니다. –

+5

결과를 저장 (캐시)하고 필요할 때마다 리플렉션을 호출 할 수도 있습니다. –

8

마찬가지로 모노 런타임을 확인할 수 있습니다

5

C# 6의 출현으로 이제는 get 전용 속성으로 바뀔 수 있으므로 실제 확인은 한 번만 수행됩니다.

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

여기 내 프로젝트에서 사용하고 캐싱 버전 : 당신이 자주 호출하는 경우

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 탁월한 발칸 반도로, 캐싱은 여기에 유용합니다. Lazy<bool>에 배치하면 리플렉션 호출은 한 번만 발생합니다.

관련 문제