如何自动将版本号插入AssemblyName

2023-12-01

我试图建立在这个问题的基础上:

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

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

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

Thanks.

EDIT:通过将以下内容添加到我的 .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>

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

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

Thanks!

EDIT:按照 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”与“dllfilemodified”)。

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

在 WriteLinesToFile 任务之后,看起来构建了以下目标:

  • 增量清理(已完成)
  • 构建后事件
  • 核心构建
  • 构建后
  • Build

其中没有对任何 DLL 名称的引用。

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


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

enter image description here

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何自动将版本号插入AssemblyName 的相关文章

  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 在 Flex URLRequest 中设置 cookie

    我正在尝试在 Flex 中设置 cookie 但似乎不起作用 难道我做错了什么 这可能吗 看来这件事应该很简单 var fileRef FileReference fileRef is configured var cookieString
  • Facebook php SDK getLogoutUrl() 问题

    当我想从我的网站注销用户时 我使用 logoutUrl facebook gt getLogoutUrl array next gt logout php And logoutUrl显示正确的链接 但它没有将我重定向到下一步中指定的网址 它
  • Drupal 7 - 根据内容数据隐藏内容编辑表单的某些表单字段

    在Drupal 7中 有没有办法根据特定内容更改内容类型的标准编辑形式 例如 我有一个带有复选框的内容类型 一旦选中并保存表单 我不希望该复选框再可见 因此 根据数据库中的复选框值 我想在以下情况下隐藏表单字段显示表格 我正在构建一个小型的
  • XML 到 LINQ 并检查空元素

    我面临的情况是使用 Linq 将 XML 文档解析为对象 在解析过程中 我会检查以确保 Elements 不为空 然后再继续解析它们的值 有没有办法简化这个声明 var variable from x in xdoc Descendants
  • 使用流按 List 对 Map 进行排序

    Map
  • Java 进度条反馈

    我有 MainProgramWindow GUI 该GUI有一些变量和一键调用Sql类的createExcel方法并同时启动进度条 public class MainProgramWindow extends javax swing JFr
  • Linphone Android:自签名证书的 TLS 握手错误

    我正在尝试使用自签名证书在 Linphone Android 中配置 TLS 以便能够与 FreeSWITCH SIP 服务器进行通信 但 SSL 握手失败并出现以下错误 通道 0x9ec3c000 SSL 握手失败 X509 证书验证失败
  • 在PYQT5 python中设置文本

    我的程序是基于人工智能的 我在 stackoverflow 中看到了所有关于 Pyqt 设置文本的帖子 我想在单击 自动 AI 按钮时在 lineEdit 中设置文本 def AI click self self lineEdit setT
  • 无法加载捆绑包中的 NIB

    由于未捕获的异常 NSInternalInconsistencyException 而终止应用程序 原因 无法在捆绑包中加载 NIB NSBundle 已加载 名称为 ViewLecturer ViewLecturer viewLectur
  • 使用 Spring Security SAML 将请求参数添加到 SAML 请求

    我需要向 SAML 请求添加请求参数 例如 locale en 以便让登录页面显示正确的语言 我怎么做 我尝试将该属性添加到作为参数发送给开始方法 SamlEntryPoint 的 HttpServletRequest 但这似乎不起作用 有
  • iOS 静态库 + CocoaPods 和重复符号错误

    我正在开发一个静态库 iOS 框架 Jeff Verkoeyen 方式 并且添加了 CocoaPods 来管理依赖项 这是与有关重复符号的其他问题的最大区别 当使用 CocoaPods 的客户端使用我的静态库 框架和我也在使用的第三方库时
  • QSound::play("soundpath") 调用有效,但 QSound 对象无效

    我正在尝试播放声音QSound模块 它尝试使用此代码并工作 QSound play sounds sources BeepSound wav 但我想要这个但不起作用 我创建了一个动态实例QSound并演奏 sounds new QSound
  • java 中的 new Date() 转儒略日期格式

    我需要将 new Date 转换为儒略日期格式 java 中是否有为此构建的函数 我的确切要求是 以儒略日期格式 0YYDDD 表示文件的创建日期 0 数字零 YY 年份的最后两位数 DDD 年内的天数 最多可以是传输日期之前的 7 个日历
  • 如何在 tkinter 中创建日期选择器?

    tkinter 应用程序是否有任何标准方式允许用户选择日期 如果有人仍然需要这个 这里有一个简单的代码 用于使用 tkcalendar 包创建日历和 DateEntry 小部件 pip install tkcalendar 用于安装包 tr
  • 使用 Spring Integration 同时读取 CSV 文件

    我想使用 spring 集成同时处理 CSV 文件 每行将被转换为单独的消息 所以假设我在 CSV 文件中有 10K 行 我想启动 10 个线程 每一行都会传递给这个线程 如果有人向我展示任何示例 那就太好了 Thanks 从 开始Spri
  • 如何编写 Delphi Galileo IDE Expert?

    HI 我想为 D2007 D2009 又名 Galileo IDE 编写一个小型的 Delphi IDE Expert 以便显示一个带有 TMemo 实例的窗口 以及上面备忘录中表单设计器的所有组件名称和类 所选组件将标有 专家应出现在菜单
  • 在 AWS Sagemaker 上安装 graphviz

    我在使用 Python3 的 Jupyter 笔记本上尝试使用如下代码绘制一棵树 import xgboost as xgb from xgboost import plot tree plot tree model num trees 4
  • 如何以编程方式确定 ndb 属性是否为多值

    我正在将应用程序从 Datastore 转换为 ndb 并且在 xml 导入例程中遇到问题 问题是我无法以编程方式确定 ndb model 类的属性是否是多值属性 我怀疑这是由于缺乏基本的 Python 技能 因为到目前为止我编写的代码显示
  • 将 Windows 7 手机的联系人列表集成到应用程序中

    如何获取 Windows 7 手机的联系人列表以在 win7 手机应用程序中使用 对于早期版本的 Windows Phone 7 SDK 只能使用选择器检索电话号码或电子邮件地址以及其他一些信息 现在 使用 7 1 Mango SDK 可以
  • 如何自动将版本号插入AssemblyName

    我试图建立在这个问题的基础上 从 MSBuild 中的文件读取单个值 我的目标是有一个位置来放置多个项目中使用的版本号 并且我还希望其中一个项目的 DLL 文件名中包含版本号的一部分 根据上面的问题 我已经得到了第一部分 但我在第二部分上遇