c# - 获取代码中的版本号.Net Core 3 WPF Sideload
问题描述
我能够使用 .NET Core 3.0 WPF 和旁加载(Windows Store 应用程序包,但来自本地 UNC 路径)构建、部署和安装我的项目。这一切似乎都工作正常,但我找不到通过代码获取当前版本号的方法,以便在应用程序运行时向用户显示。
我已经尝试过使用反射和 XML 在 ClickOnce 中一直使用的方式。我还尝试使用我在其他地方看到的 UWP 方法,但似乎无法在 WPF/.NET Core 3 中使用 Windows.ApplicationModel
这种方式在带有 ClickOnce 的 .NET Framework 中对我有用
XmlDocument xmlDoc = new System.Xml.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).ToString();
这看起来就像人们使用 UWP 和 Windows 应用商店所做的一样
Package package = Windows.ApplicationModel.Package.Current;
PackageId packageId = package.Id;
PackageVersion version = packageId.Version;
我也尝试过使用 Reflection 执行此操作,但它始终返回 1.0.0.0,即使在部署时也是如此。
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;
解决方案
您可以简单地加载 MSIX 的清单:
private Version GetMsixPackageVersion()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var manifestPath = assembly.Location.Replace(assembly.ManifestModule.Name, "") + "\\AppxManifest.xml";
if (File.Exists(manifestPath))
{
var xDoc = XDocument.Load(manifestPath);
return new Version(xDoc.Descendants().First(e => e.Name.LocalName == "Identity").Attributes()
.First(a => a.Name.LocalName == "Version").Value);
}
return new Version(0,0,0,0);
}
请注意,它在开发过程中不可用,尽管我只是将清单复制到调试文件夹以进行测试。
推荐阅读
- node.js - 使用 Multer 进行文件验证 - Expressjs
- flutter - 我希望将布尔帐户设置为 firestore 数据库中的布尔值
- r - r - vegan package NMDS 分类环境变量
- java - 如何从匿名内部类更改 side 方法中的变量值?
- jasmine - 是否有一种简单的方法可以检查未定义变量时是否未调用方法?
- javascript - 如何根据输入参数创建可观察的子集?
- asp.net-mvc - Web 部署失败服务器在处理请求时遇到问题
- machine-learning - 如何在 5*4 子图中显示 kdeplot?
- excel - Excel VBA 选择每个其他单元格并将其粘贴到另一个工作表中?
- c - 函数调用结束后数组不会被擦除