2

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

<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?

4

2 回答 2

3

GetAssemblyIdentity可以获取有关已编译程序集的信息。任务输出包含有关版本、PublicKeyToken 和文化的元数据条目。

我用作$(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>
于 2013-05-29T13:22:36.537 回答
1

以下代码来自 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>
于 2013-06-07T10:12:04.770 回答