为了让人们知道他们正在使用的程序版本,我想在窗口标题中显示productversion。我可以手动执行此操作,但我希望这是动态的,因此每次版本更改时我都不必更改这两个项目。
这可能在代码中执行此操作而不会弄乱安装程序吗?
答案 0 :(得分:8)
您可以使用以下代码从AssemblyName.Version
属性中检索版本:
Version version = Assembly.GetExecutingAssembly().GetName().Version;
this.Text = "My Cool Product - Version " + version;
// or with a fancier formatting
this.Text = string.Format("My Cool Product - Version {0}.{1}.{2} Revision {3}",
version.Major, version.Minor, version.Build, version.Revision);
更新(评论后):
您还可以从存储在注册表中的MSI信息中读取设置的版本。这最好基于您的设置指定的 UpgradeCode 来完成,因为UpgradeCode不应在版本之间更改。以下示例程序演示了如何获取属于特定UpgradeCode的已安装版本 1 :
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
[DllImport("msi.dll", CharSet = CharSet.Unicode)]
static extern Int32 MsiGetProductInfo(string product, string property,
[Out] StringBuilder valueBuf, ref Int32 len);
[DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 MsiEnumRelatedProducts(string strUpgradeCode,
int reserved, int iIndex, StringBuilder sbProductCode);
static void Main(string[] args)
{
List<string> installedVersions =
GetInstalledVersions("{169C1A82-2A82-490B-8A9A-7AB7E4C7DEFE}");
foreach (var item in installedVersions)
{
Console.WriteLine(item);
}
}
static List<string> GetInstalledVersions(string upgradeCode)
{
List<string> result = new List<string>();
StringBuilder sbProductCode = new StringBuilder(39);
int iIdx = 0;
while (
0 == MsiEnumRelatedProducts(upgradeCode, 0, iIdx++, sbProductCode))
{
Int32 len = 512;
StringBuilder sbVersion = new StringBuilder(len);
MsiGetProductInfo(sbProductCode.ToString(),
"VersionString", sbVersion, ref len);
result.Add(sbVersion.ToString());
}
return result;
}
}
1 请注意,可能会并行安装一个产品的多个版本。在极少数情况下,您将获得包含所有已安装版本的列表。
答案 1 :(得分:6)
试试这个:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
答案 2 :(得分:0)
像这样:
Text = "MyApplication v" + typeof(MyForm).Assembly.GetName().Version;
这将读取AssemblyInfo.cs中的[assembly: AssemblyVersion("...")]
属性,也可以在Project Properties中设置(通过单击 Assembly Information ... 按钮)
答案 3 :(得分:0)
这是我使用DataBinding和Reflection的解决方案:
在XAML中:
<Window ...
Title="{Binding WindowTitle, RelativeSource={RelativeSource Mode=Self}}"
>
在代码中:
public string WindowTitle
{
get
{
Version version = Assembly.GetExecutingAssembly().GetName().Version;
return "MyTitle v" + version;
}
}