【问题标题】:Reference AssemblyFileVersion in csproj file在 csproj 文件中引用 AssemblyFileVersion
【发布时间】:2013-05-29 12:59:51
【问题描述】:

一旦我的 nant 构建完成,我想使用附加到项目 .csproj 文件末尾(在项目元素内)的构建后命令重命名生成的 .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?

【问题讨论】:

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


    【解决方案1】:

    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>
    

    【讨论】:

    • 您好,谢谢您的回答 :) !但是,生成的数字是 0.0.0.0 而不是 1.5.1(有关我的问题的更新,请参见上文) - 所以它似乎不是在访问 AssemblyFileVersion 而是其他东西。有什么想法吗?
    • @Zainodis,如果你设置[assembly: AssemblyVersion("1.5.1")],你会得到你想要的。 GetAssemblyIdentity 只能读取 AssemblyVersion,而不是 AssemblyFileVersion
    • @LexLi 实际上我怀疑并在上面发布我的评论之前尝试过,但即使我更改了该值,它仍然会吐出数字 0.0.0.0 oO - 我会遗漏什么吗?跨度>
    • 我修改了我的帖子,所以你可能想尝试这种方式。还要确保描述版本的程序集实际上是$(TargetDir)\$(TargetName).exe
    • 很抱歉这么久才回复,非常感谢您更新您的问题。我遵循了您更新的步骤,但奇怪的是,我找不到 GetAssemblyInfo 任务。我对此并不陌生,但是我从构建输出中收集到的内容,可能是我也必须实现相应的任务类吗?错误消息还说,另一个条件是要在项目文件中的 中删除任务。我会尝试这两件事,看看它是否能解决问题:)
    【解决方案2】:

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

    正如您在 ISun 的回答下的 cmets 中看到的那样,我总是得到版本 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 文件中的结束标记之前添加以下 sn-p:

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

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2023-03-31
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多