2010-09-30 22 views
22

W języku C# można użyć System.Version.Assembly, aby uzyskać wersję uruchomionej aplikacji. Jednak wydaje się, że nie istnieje w Silverlight dla Windows Phone. Czy istnieje alternatywa?Jak uzyskać wersję aplikacji w systemie Windows Phone?

+1

Czas na zaakceptowanie niektórych odpowiedzi? – AnthonyWJones

+0

@AnthonyWJones OK, teraz rozumiem twój komentarz. Mówisz, że henry nie zaakceptował odpowiedzi na pytania, które prosi. –

+0

Myślę, że niektórzy początkujący nie wiedzą, że mogą przyjąć odpowiedź jako poprawną ... –

Odpowiedz

19

nie wiem jak @henry zaakceptowane odpowiedź, ponieważ wszystkie odpowiedzi mówimy o wersji DLL, ale gdy ktoś mówi o coraz wersję aplikacji Windows Phone, która oznacza wersję aplikacji na rynku. Nie wiem o innych, ale naprawdę nie dbają o wersję biblioteki dll, a także używam wersji rynkowej do oznaczania źródła w kontroli źródła.

Kiedy programista przesyła XAP na rynek on/ona określa wersję XAP, która może być inna niż wersja dll, podczas przetwarzania rynku odczytuje informacje z pliku WMAppManifest.xml i zapisuje wersję podaną w zgłoszeniu XAP strona.

Tak pożądana wersja jest dostępna w pliku WMappManifest.xml, który można odczytać za pomocą XmlReader, jak poniżej;

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

Oto próbką WMAppManifest.xml

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

Więc można przeczytać wszelkie informacje chcesz z App xml tag w ten sam sposób jak czytamy wersję z App tagu. na przykład wydawca ID lub identyfikator produktu

+1

Dlaczego nie używać klasy 'Package' jako [odpowiedź Magnusa poniżej] (http://stackoverflow.com/questions/3833354/how-to-get-app-version-in-windows-phone#25714161)? –

+0

@JamieKitson: pytanie dotyczyło Windows-Phone-7 i był to czas kiedy ludzie rozważają wsparcie dla obu platform –

38

Możesz użyć metody GetExecutingAssembly i klasy AssemblyName, aby znaleźć te informacje.


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

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

+0

Czy przyniesie wersję, którą ustawimy, przesyłając Xap na rynek? –

10

On Phone 7 nie jest czysty sposób, aby uzyskać wersji. Najlepszą rzeczą do zrobienia jest przeanalizować pełną nazwę (która jest jedynym narażone nieruchomości) dla ciągu Wersja:

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

Po pierwsze, myślę, że to bardziej skłonni do korzystania Zgromadzenia informacje o wersji pliku do przenoszenia wersję aplikacji do użytkownik. Zobacz http://techblog.ranjanbanerji.com/post/2008/06/26/Net-Assembly-Vs-File-Versions.aspx

drugie, co w ten sposób:

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

Aby uzyskać wersji aplikacji z "WMappManifest.xml", to rozwiązanie może być bardziej skuteczne niż rozwiązania Mubashar Ahmad, ale to będzie działać tylko dla WP8 +, nie 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

Nie mogłem się powstrzymać, porównałem twoje rozwiązanie z Mubasharem Ahmadem używając "Stopera" i odkryłem, że twoje rozwiązanie zrobiło to w mniej niż połowie liczby wykonanych tyknięć :) –

+0

To mogło być przypadkowe, ale każdego dnia przyjmę mniej linii kodu. –

+1

@JesperRiemerAndersen W międzyczasie udoskonaliłem mój kod w czasie. Właśnie dokonałem edycji, aby odzwierciedlić moją najnowszą optymalizację. Tak, użyłem Stopwatch do porównania ponad 4 różnych parsowania xml tego pliku. –

18

Jeśli zostały przeniesione do Windows Phone 8, można po prostu użyć klasy newer PackageId:

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

Dlaczego nie jest to zaakceptowana odpowiedź? –

+0

proste i skuteczne .. 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

Wystarczy u se ta linia uzyskać nazwę aplikacji i identyfikator, nazwę wydawcy itp ...

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

Windows Phone 8.1:

using System.Reflection; 

// ... 

Version version = typeof(MainPage).GetTypeInfo().Assembly.GetName().Version; 
Powiązane problemy