在csproj文件中引用AssemblyFileVersion

时间:2013-05-29 12:59:52

标签: c# .net visual-studio-2010

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

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

正如您在上面所看到的,我正在尝试将可执行文件重命名为:MyApplication - $(AssemblyFileVersion).exe但是,这显然是错误的,因为生成的可执行文件只是命名为:MyApplication-.exe(所以版本I我试图在文件名末尾添加添加功能。)

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

[assembly: AssemblyFileVersion("1.5.1")]

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

2 个答案:

答案 0 :(得分:3)

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>

答案 1 :(得分:1)

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

正如您从ISun的答案中的注释中看到的那样,我总是得到版本0.0.0.0 - 尽管已经通过在texteditor中手动打开AssemblyInfo.cs将AssemblyFileVersion和AssemblyVersion的版本更改为1.0.0.0。我后来看了如何从我的Visual Studio编辑AssemblyInfo.cs,这是如何:

  • 右键单击您的项目(生成exe文件)
  • 点击属性
  • 在打开的窗口中打开应用程序标签(左侧的第一个标签页)
  • 您将看到用于设置程序集名称,默认名称空间等的字段,但要编辑 在AssemblyInfo.cs中,只需单击右侧的装配信息按钮
  • 即可

由于某些原因 - 在我通过上述方法(使用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>