C#では、System.Version.Assemblyを使用して、実行中のアプリのバージョンを取得できます。ただし、これはSilverlight for WindowsPhoneには存在しないようです。代替手段はありますか?
すべての回答がDLLバージョンについて話しているので、@ henryが回答をどのように受け入れたかはわかりませんが、Windows Phoneアプリのバージョンを入手することについて話している場合、それは市場に出回っているアプリのバージョンを意味します。他の人のことは知りませんが、dllのバージョンは本当に気にしません。また、市場バージョンを使用して、ソース管理でソースにラベルを付けます。
開発者が市場にXAPをアップロードするとき、開発者はdllバージョンとは異なる可能性のあるXAPのバージョンを指定し、市場の処理中にWMAppManifest.xmlファイルから情報を読み取り、XAP送信ページで指定したバージョンを書き戻します。
したがって、目的のバージョンはWMappManifest.xmlファイルで入手でき、次のようにXmlReaderで読み取ることができます。
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");
}
}
これがサンプル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>
そのため、appタグからバージョンを読み取るのと同じ方法で、Appxmlタグから必要な情報を読み取ることができます。例えば出版社IDまたは製品ID
GetExecutingAssemblyメソッドとAssemblyNameクラスを使用して、この情報を見つけることができます。
var nameHelper = new AssemblyName(Assembly.GetExecutingAssembly().FullName);
var version = nameHelper.Version;
var full = nameHelper.FullName;
var name = nameHelper.Name;
Windows Phone 8に移行した場合は、 新しいPackageId クラスを使用できます。
var version = Package.Current.Id.Version;
電話7では、バージョンを取得するためのクリーンな方法はありません。最善の方法は、バージョン文字列のフルネーム(公開されている唯一のプロパティ)を解析することです。
String appVersion = System.Reflection.Assembly.GetExecutingAssembly()
.FullName.Split('=')[1].Split(',')[0];
まず、アプリケーションのバージョンをユーザーに伝えるために、アセンブリのファイルバージョン情報を使用する方が適切だと思います。 http://techblog.ranjanbanerji.com/post/2008/06/26/Net-Assembly-Vs-File-Versions.aspx を参照してください。
次に、これを行うのはどうですか?
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);
}
}
「WMappManifest.xml」からアプリバージョンを取得するには、このソリューションはMubashar Ahmadソリューションよりも効率的かもしれませんが、WP7ではなくWP8 +でのみ機能します。
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;
}
string versionApp = XDocument.Load("WMAppManifest.xml").Root.Element("App").Attribute("Version").Value;
この行を使用して、アプリケーション名とID、発行者名などを取得します。
string name = Windows.ApplicationModel.Package.Current.DisplayName;
public static string GetAsemblyVersion()
{
return Convert.ToString(Assembly.GetCallingAssembly().GetName().Version);
}
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;
Windows Phone 8.1:
using System.Reflection;
// ...
Version version = typeof(MainPage).GetTypeInfo().Assembly.GetName().Version;