我现在正在部署一个WPF c#项目,并希望在屏幕标题上添加 clickonce版本(而不是assymbly或产品版本)。 我曾经在Win表单应用程序中使用以下方式执行此操作。但似乎它不是WPF应用程序中的方式。我在Google上搜索没找到任何东西。请帮忙。
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
lblVer.Text = "V" + ad.CurrentVersion.ToString();
}
else
lblVer.Text = "V" + Application.ProductVersion.ToString();
答案 0 :(得分:23)
试试这个:
public static Version GetPublishedVersion()
{
XmlDocument xmlDoc = new XmlDocument();
Assembly asmCurrent = System.Reflection.Assembly.GetExecutingAssembly();
string executePath = new Uri(asmCurrent.GetName().CodeBase).LocalPath;
xmlDoc.Load(executePath + ".manifest");
string retval = string.Empty;
if (xmlDoc.HasChildNodes)
{
retval = xmlDoc.ChildNodes[1].ChildNodes[0].Attributes.GetNamedItem("version").Value.ToString();
}
return new Version(retval);
}
答案 1 :(得分:6)
你得到什么错误? Windows Forms和WPF之间的ClickOnce API没有区别。它不依赖于任何UI框架。
您是否记得添加对System.Deployment.dll的引用?
答案 2 :(得分:3)
行,
我发现了这个问题。
我必须添加对System.Deployment
的引用
这就是我无法使用它的原因。这个dll也适用于winforms。
答案 3 :(得分:2)
using System;
using System.Deployment.Application;
namespace Utils
{
public class ClickOnce
{
public static Version GetPublishedVersion()
{
return ApplicationDeployment.IsNetworkDeployed
? ApplicationDeployment.CurrentDeployment.CurrentVersion
: System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
}
}
}
如果您收到有关System.Deployment.Application
的错误消息,则解决方案>项目>参考文献>添加参考>组件>框架> System.Deployment。
不解析程序集XML以获取此信息;你依赖的是无证的行为,这种行为恰好适用于现在的工作#39;
答案 4 :(得分:0)
此解决方案类似于@Engin,但使用XPath。
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("...");
XmlNamespaceManager ns = new XmlNamespaceManager(xmlDoc.NameTable);
ns.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1");
string xPath = "/asmv1:assembly/asmv1:assemblyIdentity/@version";
XmlNode node = xmlDoc.SelectSingleNode(xPath, ns);
string version = node.Value;