gpt4 book ai didi

c# - 如何自动将版本号插入 AssemblyName

转载 作者:行者123 更新时间:2023-11-30 18:27:52 25 4
gpt4 key购买 nike

我正在尝试建立这个问题:

Reading a single value from a file in MSBuild

我的目标是在一个地方放置在多个项目中使用的版本号,我还希望其中一个项目的 DLL 文件名中有部分版本号。

根据上述问题,我已经掌握了第一部分,但我在第二部分中遇到困难,希望得到一些指导。

在我的解决方案中,我设置了一个名为 Version.txt 的纯文本文件,其中仅包含我的完整版本号:

1.1.0.0

在我的两个项目中,我打开了它们的 AssemblyInfo.cs 文件并删除了 AssemblyVersion 和 AssemblyFileVersion 项,然后修改了两个项目以在单独的文件中生成它们,如上述问题中所述。

<ItemGroup>
<VersionFile Include="..\Version.txt" />
</ItemGroup>
<Target Name="BeforeBuild">
<ReadLinesFromFile File="@(VersionFile)">
<Output TaskParameter="Lines" PropertyName="VersionNumber" />
</ReadLinesFromFile>
<Delete Files="Properties\Version.cs" />
<WriteLinesToFile File="Properties\Version.cs" Lines="using System.Reflection%3B&#xD;&#xA;&#xD;&#xA;[assembly: AssemblyVersion("$(VersionNumber)")]&#xD;&#xA;[assembly: AssemblyFileVersion("$(VersionNumber)")]" />
</Target>

现在,当我构建时,我会为每个项目生成一个 Properties\Version.cs 文件,该文件用于构建 EXE/DLL 并在其文件属性中显示为“1.1.0.0”。这正是我想要的。

对于 DLL,我想将程序集命名为“filename.v1.1.dll”,其中“1.1”来自上面 Version.txt 中的前两个组件。我对 Version.txt 的格式很灵活,只要我能在 EXE/DLL 属性中获得完整的“1.1.0.0”和在 DLL 文件名中获得完整的“1.1”即可。

为了尝试这个,我将 DLL 的 csproj 文件修改为:

<RootNamespace>dllfile</RootNamespace>
<AssemblyName>dllfile.v$(VersionNumber)</AssemblyName>

当然,这会在文件名中插入完整的版本号,这是我不想要的。

有人对如何进行有任何提示吗?

谢谢。

编辑: 通过将以下内容添加到我的 .csproj BeforeBuild 目标,我已经能够提取版本号的主要/次要组件:

<ReadLinesFromFile File="@(VersionFile)">
<Output TaskParameter="Lines" PropertyName="VersionNumber" />
</ReadLinesFromFile>
<PropertyGroup>
<VersionNumberFirstDotIndex>$(VersionNumber.IndexOf('.'))</VersionNumberFirstDotIndex>
<VersionNumberMajorStart>0</VersionNumberMajorStart>
<VersionNumberMajorLen>$(VersionNumberFirstDotIndex)</VersionNumberMajorLen>
<VersionNumberMinorStart>$([MsBuild]::Add(1, $(VersionNumberFirstDotIndex)))</VersionNumberMinorStart>
<VersionNumberSecondDotIndex>$(VersionNumber.IndexOf('.', $(VersionNumberMinorStart)))</VersionNumberSecondDotIndex>
<VersionNumberMinorLen>$([MSBuild]::Subtract($([MSBuild]::Subtract($(VersionNumberSecondDotIndex), $(VersionNumberFirstDotIndex))), 1))</VersionNumberMinorLen>
<VersionNumberMajor>$(VersionNumber.Substring($(VersionNumberMajorStart), $(VersionNumberMajorLen)))</VersionNumberMajor>
<VersionNumberMinor>$(VersionNumber.Substring($(VersionNumberMinorStart), $(VersionNumberMinorLen)))</VersionNumberMinor>
<VersionNumberShort>$(VersionNumberMajor).$(VersionNumberMinor)</VersionNumberShort>
</PropertyGroup>
<Message Text="DEBUG1 VersionNumberFull=$(VersionNumber)" Importance="High" />
<Message Text="DEBUG2 VersionNumberAbbrev=$(VersionNumberShort)" Importance="High" />
<Delete Files="Properties\Version.cs" />
<WriteLinesToFile File="Properties\Version.cs" Lines="using System.Reflection%3B&#xD;&#xA;&#xD;&#xA;[assembly: AssemblyVersion(&quot;$(VersionNumber)&quot;)]&#xD;&#xA;[assembly: AssemblyFileVersion(&quot;$(VersionNumber)&quot;)]" />

我现在唯一缺少的是如何将此 VersionNumberShort 放入 DLL 文件名中。除非有人有更好的主意,否则我可以采纳 Peter 的建议并使用 Move 任务:

<Target Name="AfterBuild">
<Move SourceFiles="$(OutputPath)$(AssemblyName).pdb" DestinationFiles="$(OutputPath)$(AssemblyName).v$(VersionNumberShort).pdb" />
<Move SourceFiles="$(OutputPath)$(AssemblyName).dll" DestinationFiles="$(OutputPath)$(AssemblyName).v$(VersionNumberShort).dll" />
</Target>
<Target Name="AfterClean" DependsOnTargets="Common">
<Delete Files="$(OutputPath)$(AssemblyName).v$(VersionNumberShort).pdb" ContinueOnError="true" />
<Delete Files="$(OutputPath)$(AssemblyName).v$(VersionNumberShort).dll" ContinueOnError="true" />
</Target>

因为我需要与以前相同的属性定义,所以我将上面的代码片段移到了“公共(public)”目标中,并在此处显示的构建和清理任务中引用了它。

Peter - 如果您想将您的评论作为答案,我会接受。

谢谢!

编辑:根据 jdlugosz 的回答,我尝试在我的任务中设置 AssemblyName。不幸的是,根据顶部列出的原始示例,这似乎仍然没有任何效果:

<Target Name="BeforeBuild">
...
<WriteLinesToFile ... />
<PropertyGroup>
<AssemblyName>dllfile.v$(VersionNumber)</AssemblyName>
</PropertyGroup>
</Target>

我尝试在 Visual Studio 开发人员命令提示符下使用 MSBuild 运行它:

msbuild /target:clean projfile.csproj
msbuild /verbosity:diag projfile.csproj > out.txt

在此之前,我将我的 csproj 文件顶部和“重新定义”中的

查看输出日志,我找不到任何对修改文本的引用;输出中仍然到处都是 dllfileoriginal。

在 WriteLinesToFile 任务之后,似乎构建了以下目标:

  • IncrementalClean(完成)
  • PostBuildEvent
  • 核心 build
  • 构建后
  • build

其中没有引用任何一个 DLL 名称。

看来 仍然是我目前最好的选择。

最佳答案

目标名称显示在 IDE 属性页编辑器的配置属性选项卡下的常规页上。我自己没有方便的工具来为您查找名称,但您可以通过将 IDE 中的空白更改为 XXXX 之类的内容并保存来完成。然后在版本控制提交审查器中查看差异并查看 Property 的名称是什么。在这种情况下,然后编辑该行以将 XXXX 更改为 $(OutputPath)$(AssemblyName).v$(VersionNumberShort)

enter image description here

哦,查看 FormatVersion 任务,这可能会有所帮助。我认为也有一些预制任务可以操纵与您展示的类似的版本程序集。

我正在为版本做的是通过#defines 作为/D 命令行参数传递片段。我猜你在 C# 中没有那个,IIRC。

关于c# - 如何自动将版本号插入 AssemblyName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com