C# 在WPF应用程序上显示ClickOnce部署版本

C# 在WPF应用程序上显示ClickOnce部署版本,c#,wpf,deployment,clickonce,C#,Wpf,Deployment,Clickonce,我现在正在部署一个WPF c#项目,并希望在屏幕标题上显示clickonce版本(而不是程序集或产品版本)。 我过去常在Win form应用程序中按以下方式执行此操作。但在WPF应用程序中似乎不是这样。我在谷歌上搜索了一下,但什么也没找到。请帮忙 if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) { ApplicationDeployment ad = Applic

我现在正在部署一个WPF c#项目,并希望在屏幕标题上显示clickonce版本(而不是程序集或产品版本)。 我过去常在Win form应用程序中按以下方式执行此操作。但在WPF应用程序中似乎不是这样。我在谷歌上搜索了一下,但什么也没找到。请帮忙

    if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
    {
        ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
        lblVer.Text = "V" + ad.CurrentVersion.ToString();
    }
    else
        lblVer.Text = "V" + Application.ProductVersion.ToString();

你有什么错误?Windows窗体和WPF之间的ClickOnce API没有区别。它不依赖于任何UI框架

记得添加对System.Deployment.dll的引用吗?

好, 我发现了问题。 我不得不添加对
系统部署的引用
这就是为什么我不能使用它。此dll也适用于winforms。

请尝试以下操作:

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

此解决方案类似于@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;
如果您得到有关
System.Deployment.Application
的错误,那么解决方案>项目>引用>添加引用>程序集>框架>System.Deployment

不要解析程序集XML以获取此信息;你依靠的是“暂时”起作用的未记录行为

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