2011-12-07 18 views
12

¿Cuál es la forma recomendada de determinar la versión de tiempo de ejecución de Mono mediante programación?Determinación mediante programación de la versión de tiempo de ejecución de Mono

Hemos encontrado varios problemas cuando nuestra aplicación .Net se utiliza con versiones anteriores de Mono. A veces podemos evitar estos problemas, si sabemos a qué versión nos enfrentamos, pero a veces no podemos.

La solución para nosotros sería detectar la versión Mono mediante programación, y luego podemos aplicar las soluciones de forma transparente. Si la versión de Mono es demasiado antigua, le solicitamos al usuario que la actualice.

podemos descubrir que Mono es nuestro tiempo de ejecución con algo como esto:

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

¿Cómo podemos también determinar de forma fiable la versión mono sin inferir indirectamente? Para ser claros, necesitamos el número de versión Mono, no el número de versión .Net CLR.

+0

posible duplicado de [Cómo determinar la revisión desde la cual el tiempo de ejecución Mono actual fue construido e instalado?] (Http://stackoverflow.com/questions/ 4178129/how-to-determine-the-revision-from-which-current-mono-runtime-was-built-and-inst) – skolima

+0

@skilima La diferencia clave es que requiere un enfoque basado en línea de comandos, y esto la pregunta requiere un enfoque programático. hay algo de duplicación en una respuesta, ¡pero esa respuesta es mucho más adecuada para esta pregunta que eso! – Stewart

+0

¡La bonificación apunta a cualquier respuesta que no dependa de la reflexión! (Como un desafío puramente académico.) – Stewart

Respuesta

16

se puede comprobar la versión de tiempo de ejecución de mono como:

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

Marque esta How to determine the revision from which current Mono runtime was built and installed? para más detalles.

+0

No es perfecto porque la cadena no está formateada uniformemente en diferentes compilaciones, pero lo suficientemente cerca para nuestros propósitos, creo. Gracias. – Stewart

+4

"dispalayName" parece una elección extraña de nombre de variable! ;-) – Stewart

+0

@Stewart ¡Solucionado! – nulltoken

0

Puede utilizar esta:

System.Reflection.Assembly.GetExecutingAssembly().ImageRuntimeVersion 

hay que darle la versión Mono CLR, y como un bono que le dará la versión de CLR en Windows.

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

+0

Eso da la versión CLR, no la versión Mono, desafortunadamente. – Stewart

+0

Presumiblemente, System.Environment.Version es más simple para eso de todos modos? – Stewart

+1

Aparentemente, puede usar la reflexión para acceder a 'Mono.Runtime.GetDisplayName()'. Es un método privado que devuelve una cadena como * "Mono 1.2.6" *. – Polynomial

2

Aquí hay otra solución (sin necesidad de utilizar la reflexión)

[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

Para obtener DllImport, debe incluir: utilizando System.Runtime.InteropServices; – Guerry

+0

¿Estará bloqueado si no se ejecuta bajo mono? – jjxtra

Cuestiones relacionadas