在.NET核心的.fsproj中指定程序集版本

Ale*_*sti 11 f# .net-core

我试图在.NET核心(2.0)控制台应用程序中指定程序集版本,以便我可以通过以下方式以编程方式访问它:

open System.Reflection

let main argv =
    printfn "Assembly Version is: %s" <| Assembly.GetEntryAssembly().GetName().Version.ToString()
    0
Run Code Online (Sandbox Code Playgroud)

将版本字段添加到我的.fsproj文件的属性组中,例如:

 <PropertyGroup>
   <OutputType>Exe</OutputType>
   <TargetFramework>netcoreapp2.0</TargetFramework>
   <Version>1.0.0.1</Version>
 </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

不会更改我的测试应用程序打印的版本(它保持在0.0.0.0).

什么工作是添加AssemblyInfo.fs文件,其中设置AssemblyVersion属性,但如果可能的话我想避免这种情况并使用.fsproj文件.这可能吗?

我也很高兴有一个指针,指向我一般可以找到关于.fsproj的文档.

Sve*_*vek 5

的文档.fsproj文件

我认为格式csproj与MSBuild 相同

你可以在这里找到关于csproj文件的官方文档:https://docs.microsoft.com/en-us/dotnet/core/tools/csproj


汇编版本号

要获得程序集的"版本",您应该注意有几种类型的版本:

  • AssemblyVersion:
    major.minor.build.revision格式的数字值(例如,2.4.0.0).公共语言运行库使用此值在强名称程序集中执行绑定操作.
    注意:如果该AssemblyInformationalVersionAttribute属性不被施加到组件中,由指定的版本号AssemblyVersionAttribute属性由所使用的Application.ProductVersion,Application.UserAppDataPathApplication.UserAppDataRegistry特性.

  • AssemblyFileVersion:
    指定Win32文件版本号的字符串值.这通常默认为汇编版本.

  • AssemblyInformationalVersion:
    指定公共语言运行库未使用的版本信息的字符串值,例如完整产品版本号.
    注意:如果将此属性应用于程序集,则可以在运行时使用该Application.ProductVersion属性获取指定的字符串.该字符串还用于Application.UserAppDataPathApplication.UserAppDataRegistry属性提供的路径和注册表项中.

  • Application.ProductVersion:
    定义程序集清单的其他版本信息.

您可以在此处官方Microsoft Docs中更详细地了解每个文档 - 或者您可以在此处阅读有关程序集的信息:


从引用的程序集中获取不同的版本

// 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;
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码片段取自对类似SO问题的回答.


.fsproj直接解析文件

还可以选择fsproj使用XML 解析文件.此选项用于以编程方式添加引用或仅检查文件 - 因此它可能不适用于您的问题,但它是为了完整答案.

//using System.Xml.Linq

XDocument.Load(path).Descendants("PropertyGroup").Elements("Version").Single().Value;
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 4

这里有一个问题:

在新的 fsproj 中生成 F# assemblyinfo

简而言之,它应该可以工作,但现在不行。