在 .fsproj 中为 .NET 核心指定程序集版本
Posted
技术标签:
【中文标题】在 .fsproj 中为 .NET 核心指定程序集版本【英文标题】:Specifying assembly version in .fsproj for .NET core 【发布时间】:2018-03-18 10:51:27 【问题描述】:我正在尝试在 .NET 核心 (2.0) 控制台应用程序中指定程序集版本,以便我可以通过以下方式以编程方式访问它:
open System.Reflection
let main argv =
printfn "Assembly Version is: %s" <| Assembly.GetEntryAssembly().GetName().Version.ToString()
0
将版本字段添加到我的 .fsproj 文件的属性组,例如:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<Version>1.0.0.1</Version>
</PropertyGroup>
不会更改我的测试应用程序打印的版本(它保持在 0.0.0.0)。
有效的方法是添加一个 AssemblyInfo.fs 文件,其中设置了 AssemblyVersion 属性,但如果可能的话,我想避免这种情况并使用 .fsproj 文件。这可能吗?
我也很乐意有一个指针,指向我可以在哪里找到有关 .fsproj 的一般文档。
【问题讨论】:
【参考方案1】:
.fsproj
文件的文档
就 MSBuild 而言,我相信格式与 csproj
相同
您可以在此处找到有关 csproj 文件的官方文档:https://docs.microsoft.com/en-us/dotnet/core/tools/csproj
程序集版本号
要获取程序集的“版本”,您应该注意有几种类型的版本:
AssemblyVersion:
采用major.minor.build.revision 格式的数值(例如,2.4.0.0)。公共语言运行时使用此值在强名称程序集中执行绑定操作。注意:如果未将 AssemblyInformationalVersionAttribute
属性应用于程序集,则由 @987654332 指定的版本号@ 属性由 Application.ProductVersion
、Application.UserAppDataPath
和 Application.UserAppDataRegistry
属性使用。
AssemblyFileVersion: 指定 Win32 文件版本号的字符串值。这通常默认为程序集版本。
AssemblyInformationalVersion:
指定公共语言运行时不使用的版本信息的字符串值,例如完整的产品版本号。注意:如果将此属性应用于程序集,则它指定的字符串可以是通过使用Application.ProductVersion
属性在运行时获得。该字符串还用于Application.UserAppDataPath
和Application.UserAppDataRegistry
属性提供的路径和注册表项。
Application.ProductVersion: 定义程序集清单的附加版本信息。
您可以在official Microsoft Docs here 上更详细地了解每一项——或者您可以阅读assemblies in general here:
从引用的程序集中获取不同的版本
// assembly version
Assembly.GetExecutingAssembly().GetName().Version.ToString();
// assembly version - by path
Assembly.LoadFile('your assembly file').GetName().Version.ToString();
// file version **this is likely what you are seeking**
FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion;
// product version
FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
注意上面的代码sn-p取自an answer to a similar SO question。
直接解析.fsproj
文件
还可以选择仅使用 XML 解析 fsproj
文件。此选项旨在以编程方式添加引用或仅检查文件 - 因此它可能不适用于您的问题,但在这里是为了回答的完整性。
//using System.Xml.Linq
XDocument.Load(path).Descendants("PropertyGroup").Elements("Version").Single().Value;
【讨论】:
您的输出 (bin) 文件夹中没有 fsproj 文件,因此您无法解析它。 @IvanMilosavljevic - 我可能误读了 OP,尽管他想解析文件。我相应地更新了我的答案,感谢您的推动。 感谢您的回答,遗憾的是在我的 .fsproj 文件中设置 AssemblyVersion 属性对调用 Assembly.GetExecutingAssembly().GetName() .Version.ToString() 时获得的值没有影响(我总是得到“0.0.0.0”)...我想这是一个错误呢? @SvekFileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion
,只返回一个空字符串(在我的 .fsproj 文件中,我为 AssemblyVersion
、FileVersion
和 Version
设置了属性)【参考方案2】:
这里有一个问题:
Generate F# assemblyinfo in new fsproj
简而言之,它应该可以工作,但现在不行。
【讨论】:
现在可与 .net sdk 2.2.100 或更高版本一起使用以上是关于在 .fsproj 中为 .NET 核心指定程序集版本的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 SQL Server 2014 中为 .NET 框架程序集创建非对称密钥?
在 NET 5 asp.net 核心 Web 应用程序中为 Kestrel 启用 Windows 身份验证
在 asp .net 核心中为 MediatR 库的发送和发布方法添加通用处理程序
如何在 .Net 核心 exe/程序集上运行 ildasm?