2010-09-30 15 views
22

En C# se puede usar System.Version.Assembly para obtener la versión de una aplicación en ejecución. Sin embargo, esto no parece existir en Silverlight para Windows Phone. ¿Hay una alternativa?¿Cómo obtener la versión de la aplicación en Windows Phone?

+1

¿Es tiempo de aceptar algunas respuestas? – AnthonyWJones

+0

@AnthonyWJones Bien, ahora entiendo tu comentario. Estás diciendo que Henry no ha aceptado una respuesta para las preguntas que hace. –

+0

Creo que algunos novatos no se dan cuenta de que pueden aceptar una respuesta como correcta ... –

Respuesta

19

No sé cómo @henry aceptaron la respuesta porque todas las respuestas están hablando de versión de DLL pero cuando uno está hablando acerca de cómo obtener la versión de la aplicación de Windows Phone que significa la versión de la aplicación en el mercado. No sé sobre otros, pero realmente no me importa la versión de dll y también uso la versión de mercado para etiquetar la fuente en control de fuente.

Cuando un desarrollador carga XAP en el mercado, especifica la versión de XAP que puede ser diferente a la versión dll, mientras procesa Market lee información del archivo WMAppManifest.xml y escribe la versión que especifique en el envío de XAP página.

Así que la versión deseada está disponible en el archivo WMappManifest.xml que puede leer por XmlReader de la siguiente manera;

public static string GetAppVersion() 
    { 
     var xmlReaderSettings = new XmlReaderSettings 
     { 
      XmlResolver = new XmlXapResolver() 
     }; 

     using (var xmlReader = XmlReader.Create("WMAppManifest.xml", xmlReaderSettings)) 
     { 
      xmlReader.ReadToDescendant("App"); 

      return xmlReader.GetAttribute("Version"); 
     } 
    } 

Aquí es WMAppManifest.xml muestra

<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2012/deployment" AppPlatformVersion="8.0"> 
    <DefaultLanguage xmlns="" code="en-US"/> 
    <App xmlns="" ProductID="{cc18507d-0de0-42d6-8b0f-05addeafd21e}" Title="CaledosLab.Phone.ContosoLogTest" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal" Author="CaledosLab.Phone.ContosoLogTest author" Description="Sample description" Publisher="CaledosLab.Phone.ContosoLogTest" PublisherID="{a204adfc-7718-4c4a-afb4-c1c39ec50d30}"> 
    </App> 
</Deployment> 

para que pueda leer la información que desee de la etiqueta XML Aplicación de la misma manera como se lee la versión de la etiqueta de aplicación. p.ej. editor o identificación del producto

+1

¿Por qué no utilizar la clase 'Package' como [la respuesta de Magnus a continuación] (http://stackoverflow.com/questions/3833354/how-to-get-app-version-in-windows-phone#25714161)? –

+0

@JamieKitson: la pregunta era para windows-phone-7 y era el momento en que la gente consideraba que era compatible con ambas plataformas –

38

Puede usar el método GetExecutingAssembly y la clase AssemblyName para encontrar esta información.


var nameHelper = new AssemblyName(Assembly.GetExecutingAssembly().FullName); 

    var version = nameHelper.Version; 
    var full = nameHelper.FullName; 
    var name = nameHelper.Name; 

+0

¿Traerá la versión que configuramos mientras cargamos el xap en el mercado? –

10

en el teléfono 7 no hay manera limpia para obtener la versión. Lo mejor que puede hacer es analizar el nombre completo (que es la única propiedad expuesta) de la cadena de versión:

String appVersion = System.Reflection.Assembly.GetExecutingAssembly() 
        .FullName.Split('=')[1].Split(',')[0]; 
5

En primer lugar, creo que es más apto para utilizar información de versión de archivo de la asamblea para transportar la versión de la aplicación de el usuario. Ver http://techblog.ranjanbanerji.com/post/2008/06/26/Net-Assembly-Vs-File-Versions.aspx

En segundo lugar, ¿qué hay de hacer esto:

using System; 
using System.Linq; 
using System.Reflection; 

public static class AssemblyExtensions 
{ 
    public static Version GetFileVersion(this Assembly assembly) 
    { 
     var versionString = assembly.GetCustomAttributes(false) 
      .OfType<AssemblyFileVersionAttribute>() 
      .First() 
      .Version; 

     return Version.Parse(versionString); 
    } 
} 
1
System.Text.RegularExpressions.Regex regexVersion = new System.Text.RegularExpressions.Regex(@".*(?<v>\d+.\d+.\d+.\d+).*"); 
System.Text.RegularExpressions.Match regexVersion_Match = regexVersion.Match(System.Reflection.Assembly.GetExecutingAssembly().FullName); 
string appVersion = ""; 
if (regexVersion_Match.Success) 
    appVersion = regexVersion_Match.Groups["v"].Value; 
3

Para obtener Versión de la aplicación de "WMAppManifest.xml", esta solución puede ser más eficiente que la solución Mubashar Ahmad, pero sólo funcionarán para WP8 +, no WP7:

using (var stream = new FileStream("WMAppManifest.xml", FileMode.Open, FileAccess.Read)) 
{ 
    var appVersion = XElement.Load(stream).Element("App").Attribute("Version"); 
    return appVersion != null ? appVersion.Value : null; 
} 
+1

no pude evitarlo, comparé su solución con Mubashar Ahmad usando un 'Cronómetro', y descubrí que su solución lo hizo en menos de la mitad del número de ticks transcurridos :) –

+0

Podría haber sido una coincidencia, pero tomaré menos líneas de código cualquier día. –

+1

@JesperRiemerAndersen Mientras tanto, he mejorado mi código a lo largo del tiempo. Acabo de hacer una edición para reflejar mi última optimización. Sí, usé Cronómetro para comparar más de 4 análisis xml diferentes de este archivo. –

18

Si se ha mudado a Windows Phone 8, sólo tiene que utilizar la clase newer PackageId:

var version = Package.Current.Id.Version; 
+0

¿Por qué no es esta la respuesta aceptada? –

+0

simple y eficaz..Thnx –

2
string versionApp = XDocument.Load("WMAppManifest.xml").Root.Element("App").Attribute("Version").Value; 
1
public static string GetAsemblyVersion() 
{ 
    return Convert.ToString(Assembly.GetCallingAssembly().GetName().Version); 
} 
1

simplemente u SE esta línea para obtener el nombre de la aplicación y Id, nombre del editor, etc ...

string name = Windows.ApplicationModel.Package.Current.DisplayName; 
0

Windows Phone 8.1:

using System.Reflection; 

// ... 

Version version = typeof(MainPage).GetTypeInfo().Assembly.GetName().Version; 
Cuestiones relacionadas