2009-04-06 40 views
40

Tôi muốn biết trong khi thực thi chương trình cho dù chương trình đang được thực hiện bằng cách sử dụng thời gian chạy Mono hay thời gian chạy của Microsoft.Cách phát hiện thời gian chạy .NET nào đang được sử dụng (MS so với Mono)?

Tôi hiện đang sử dụng đoạn mã sau để xác định xem tôi trên MS CLR:

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

Tuy nhiên, điều này phần nào phụ thuộc vào thư mục cài đặt của thời gian chạy và tôi không chắc liệu điều này sẽ hoạt động trên tất cả các cài đặt.

Có cách nào tốt hơn để kiểm tra thời gian chạy hiện tại không?

Trả lời

69

Từ Guide to Porting Winforms Applications các dự án Mono:

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

Tôi chắc chắn bạn sẽ có nhiều câu hỏi hơn, vì vậy đáng để kiểm tra hướng dẫn này và mono-forums

+0

Cảm ơn các con trỏ tốt. –

+5

Bạn có thể muốn lưu (cache) kết quả là tốt, gọi điện thoại phản ánh mỗi lần có thể tốn kém. –

21

Bạn có thể kiểm tra sự Mono Runtime Như thế này

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

chỉ cần chạy vào mã bên dưới ..

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

Với sự ra đời của C# 6, điều này bây giờ có thể được chuyển thành thuộc tính chỉ nhận, vì vậy việc kiểm tra thực tế chỉ được thực hiện một lần.

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

Dưới đây là một phiên bản với bộ nhớ đệm mà tôi đang sử dụng trong dự án của tôi:

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

Như @ahmet Balkan alp đã đề cập, bộ nhớ đệm là hữu ích ở đây nếu bạn đang gọi điện thoại này thường xuyên. Bằng cách gói nó trong một Lazy<bool>, cuộc gọi phản chiếu chỉ xảy ra một lần.

Các vấn đề liên quan