在csproj文件中引用AssemblyFileVersion

本文关键字:引用 AssemblyFileVersion 文件 csproj | 更新日期: 2023-09-27 18:15:48

一旦我的nant构建已经完成,我想重命名生成的。exe文件使用后构建命令,该命令附加到项目。csproj文件的末尾(在项目元素中):

<Target Name="AfterBuild">
  <Copy SourceFiles="$(TargetDir)'$(TargetName).exe" DestinationFiles="$(TargetDir)'MyApplication-$(AssemblyFileVersion).exe" SkipUnchangedFiles="true" />
</Target>

正如你在上面看到的,我试图将可执行文件重命名为:MyApplication-$(AssemblyFileVersion).exe然而,这显然是错误的,因为结果可执行文件被简单地命名为:MyApplication-.exe(所以我试图在文件名末尾添加的版本缺失)。

我在AssemblyInfo.cs文件中定义了AssemblyFileInfoVersion,如下所示:

[assembly: AssemblyFileVersion("1.5.1")]

所以问题是:我如何才能访问同一个项目的csproj文件中的AssemblyFileVersion ?

在csproj文件中引用AssemblyFileVersion

GetAssemblyIdentity可以获取编译程序集的信息。任务输出包含Version、PublicKeyToken和Culture的元数据项。

我使用$(TargetDir)'$(TargetName).exe作为汇编文件。

<ItemGroup>
    <AssembliesPath Include="$(TargetDir)'$(TargetName).exe" />
</ItemGroup>
<Target Name="GetAssemblyInfo">
    <GetAssemblyIdentity AssemblyFiles="@(AssembliesPath)">
        <Output TaskParameter="Assemblies" ItemName="AssemblyInfo"/>
    </GetAssemblyIdentity>
</Target>

然后:

<Target Name="AfterBuild">
    <GetAssemblyInfo />
    <Copy SourceFiles="$(TargetDir)'$(TargetName).exe" DestinationFiles="$(TargetDir)'MyApplication-%(AssemblyInfo.Version).exe" SkipUnchangedFiles="true" />
</Target>

以下代码来自ISun的原始答案,这实际上是我最终如何做的,因为我在定义自定义任务时遇到了问题(ms构建引用不断被自动踢,构建不断失败)。

正如你可以从ISun的回答下的评论中看到的,我总是得到版本0.0.0.0 -尽管通过在文本编辑器中手动打开AssemblyInfo.cs,将AssemblyFileVersion和AssemblyVersion的版本更改为1.0.0.0。我后来阅读了如何在我的Visual Studio中编辑AssemblyInfo.cs,下面是如何编辑的:

    右键单击你的项目(生成exe文件)
  • 点击属性
  • 在打开的窗口中打开应用程序选项卡(左侧第一个选项卡)
  • 您将看到用于设置程序集名称,默认名称空间等的字段,但是要编辑AssemblyInfo.cs,只需点击右边的Assembly Information按钮

由于某种原因-我不知道为什么它突然工作,之后我把所有的信息通过上面的方法(使用Visual Studio) !当我第一次使用上述方式打开AssemblyInfo.cs时,尽管它们在实际文件中被填充,但我的所有字段实际上都是空的。

现在我得到了AssemblyInfo.cs最终正确运行,我使用ISun的原始代码来实现我的目标。通过在项目的的结束标记之前添加以下代码片段。csproj 文件:

<Import Project="$(MSBuildToolsPath)'Microsoft.CSharp.targets" />
<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetDir)'$(TargetName).exe">
        <Output TaskParameter="Assemblies" ItemName="AssemblyInfo"/>
    </GetAssemblyIdentity>
    <Copy SourceFiles="$(TargetDir)'$(TargetName).exe" DestinationFiles="$(TargetDir)'MyApplication-%(AssemblyInfo.Version).exe" SkipUnchangedFiles="true" />
</Target>