2011-12-07 49 views
12

Cách được khuyến nghị để xác định phiên bản thời gian chạy Mono theo chương trình là gì?Lập trình xác định phiên bản thời gian chạy Mono

Chúng tôi đã gặp phải nhiều sự cố khi ứng dụng .Net của chúng tôi được sử dụng với các phiên bản cũ hơn của Mono. Đôi khi chúng ta có thể giải quyết những vấn đề này, nếu chúng ta biết chúng ta đang xử lý phiên bản nào, nhưng đôi khi chúng ta không thể.

Giải pháp cho chúng tôi là phát hiện phiên bản Mono theo chương trình và sau đó chúng tôi có thể áp dụng giải pháp một cách minh bạch. Nếu phiên bản Mono quá cũ, thì chúng tôi sẽ nhắc người dùng nâng cấp.

Chúng ta có thể khám phá ra rằng Mono là thời gian chạy của chúng tôi với một cái gì đó như thế này:

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

Làm thế nào chúng ta có thể cũng xác định chắc chắn phiên bản mono mà không cần suy luận nó gián tiếp? Để rõ ràng, chúng tôi cần số phát hành Mono, không phải số phiên bản .Net CLR.

+0

thể trùng lặp của [Làm thế nào để xác định phiên bản mà từ đó thời gian chạy Mono hiện tại được xây dựng và cài đặt?] (Http://stackoverflow.com/questions/ 4178129/cách-để-xác định-sửa đổi-từ-mà-hiện-mono-runtime-được xây dựng-và-inst) – skolima

+0

@skilima Sự khác biệt chính là yêu cầu một cách tiếp cận dựa trên dòng lệnh, và điều này câu hỏi yêu cầu một cách tiếp cận chương trình. có một số trùng lặp trong một câu trả lời, nhưng câu trả lời đó phù hợp hơn với câu hỏi này nhiều hơn thế! – Stewart

+0

Điểm thưởng cho bất kỳ câu trả lời nào không dựa vào sự phản chiếu! (Là một thách thức hoàn toàn về mặt học thuật.) – Stewart

Trả lời

16

Bạn có thể kiểm tra phiên bản runtime mono như:

Type type = Type.GetType("Mono.Runtime"); 
if (type != null) 
{ 
    MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static); 
    if (displayName != null) 
     Console.WriteLine(displayName.Invoke(null, null)); 
} 

Kiểm tra How to determine the revision from which current Mono runtime was built and installed? này để biết thêm chi tiết.

+0

Không hoàn toàn hoàn hảo vì chuỗi không được định dạng thống nhất trên các bản dựng khác nhau, nhưng đủ gần cho mục đích của chúng tôi, tôi nghĩ vậy. Cảm ơn. – Stewart

+4

"dispalayName" có vẻ như một sự lựa chọn kỳ lạ của tên biến mặc dù! ;-) – Stewart

+0

@Stewart Đã sửa lỗi! – nulltoken

0

Bạn có thể sử dụng này:

System.Reflection.Assembly.GetExecutingAssembly().ImageRuntimeVersion 

Nó sẽ cung cấp cho bạn phiên bản Mono CLR, và như là một tiền thưởng nó sẽ cung cấp cho bạn phiên bản CLR trên Windows.

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.imageruntimeversion.aspx

+0

Điều đó mang lại cho phiên bản CLR chứ không phải phiên bản Mono. – Stewart

+0

Có lẽ, System.Environment.Version đơn giản hơn cho điều đó? – Stewart

+1

Kiểm dịch, bạn có thể sử dụng sự phản chiếu để truy cập 'Mono.Runtime.GetDisplayName()'. Đó là một phương thức riêng trả về một chuỗi như * "Mono 1.2.6" *. – Polynomial

2

Đây là một giải pháp khác (không sử dụng phản ánh)

[DllImport("__Internal", EntryPoint="mono_get_runtime_build_info")] 
public extern static string GetMonoVersion(); 


Console.WriteLine("Mono version: {0}",GetMonoVersion()); 
Mono version: 3.12.0 (tarball Sat Feb 7 19:13:43 UTC 2015) 
+1

Để nhận DllImport, bạn phải bao gồm: bằng System.Runtime.InteropServices; – Guerry

+0

Sự cố này có bị lỗi nếu không chạy dưới chế độ mono không? – jjxtra

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