デスクトップアプリケーションの公開バージョンを表示したいと思います。私はこのコードでそれをやろうとしています:
_appVersion.Content = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
問題は、プロジェクトのプロパティにある公開バージョンを正確に取得できないことです。以下はそのスクリーンショットです:
しかし、私は3.0.0.12546
を取得しています。誰かが問題がどこにあるか知っていますか?
私もこの問題を抱えていて、AssemblyInfo.cs
で設定されたバージョン番号がProperties
で設定されたバージョン番号に干渉していることがわかりました。
[Assembly: AssemblyVersion("1.0.0.0")]
[Assembly: AssemblyFileVersion("1.0.0.0")]
私は通常、これらの行をAssemblyInfo
からコメントして、次のように置き換えます。
[Assembly: AssemblyVersion("1.0.*")]
これらの値がAssemblyInfo
ファイルにハードコードされているかどうかを確認してください。
自動バージョン管理に関する興味深い議論については、 this SO question を参照してください。AssemblyInfo.cs
をチェックするときは、自動インクリメント(*
--if使用している)はAssemblyVersion
のみを対象とし、AssemblyFileVersion
は対象としません。
プログラムをデバッグするときに、でアセンブリのプロパティを確認できます。
\bin\Release\app.publish
Details
タブで、バージョン番号を確認します。これは、VSで指定した設定のいずれかと一致しますか?
以下に説明するように、バージョン情報を返す1つのプロパティを作成し、そのプロパティを使用できます。
public string VersionLabel
{
get
{
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
Version ver = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
return string.Format("Product Name: {4}, Version: {0}.{1}.{2}.{3}", ver.Major, ver.Minor, ver.Build, ver.Revision, Assembly.GetEntryAssembly().GetName().Name);
}
else
{
var ver = Assembly.GetExecutingAssembly().GetName().Version;
return string.Format("Product Name: {4}, Version: {0}.{1}.{2}.{3}", ver.Major, ver.Minor, ver.Build, ver.Revision, Assembly.GetEntryAssembly().GetName().Name);
}
}
}
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
assemblyInfo.csファイルに存在するアセンブリバージョンを取得します。公開ダイアログで設定した公開バージョンを取得するには、次を使用する必要があります。
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion
ただし、System.Deploymentへの参照を追加する必要があることに注意してください。これは、プロジェクトファイルを右クリックして[公開]をクリックしてアプリケーションを公開した後にのみ機能します。公開するたびに、リビジョンがインクリメントされます。
上記の行をデバッグモードで呼び出そうとすると、機能せず、例外がスローされるため、次のコードを使用できます。
try
{
return System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
}
catch(Exception ex)
{
return Assembly.GetExecutingAssembly().GetName().Version;
}
Lambda式でC#6.0を使用する
private string GetVersion => ApplicationDeployment.IsNetworkDeployed ? $"Version: {ApplicationDeployment.CurrentDeployment.CurrentVersion}" : $"Version: {Application.ProductVersion}";