- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试建立这个问题:
Reading a single value from a file in 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

[assembly: AssemblyVersion("$(VersionNumber)")]
[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>
当然,这会在文件名中插入完整的版本号,这是我不想要的。
有人对如何进行有任何提示吗?
谢谢。
编辑: 通过将以下内容添加到我的 .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

[assembly: AssemblyVersion("$(VersionNumber)")]
[assembly: AssemblyFileVersion("$(VersionNumber)")]" />
我现在唯一缺少的是如何将此 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>
因为我需要与以前相同的属性定义,所以我将上面的代码片段移到了“公共(public)”目标中,并在此处显示的构建和清理任务中引用了它。
Peter - 如果您想将您的评论作为答案,我会接受。
谢谢!
编辑:根据 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。
在 WriteLinesToFile 任务之后,似乎构建了以下目标:
其中没有引用任何一个 DLL 名称。
看来 仍然是我目前最好的选择。
最佳答案
目标名称显示在 IDE 属性页编辑器的配置属性选项卡下的常规页上。我自己没有方便的工具来为您查找名称,但您可以通过将 IDE 中的空白更改为 XXXX 之类的内容并保存来完成。然后在版本控制提交审查器中查看差异并查看 Property 的名称是什么。在这种情况下,然后编辑该行以将 XXXX 更改为 $(OutputPath)$(AssemblyName).v$(VersionNumberShort)
哦,查看 FormatVersion
任务,这可能会有所帮助。我认为也有一些预制任务可以操纵与您展示的类似的版本程序集。
我正在为版本做的是通过#defines 作为/D
命令行参数传递片段。我猜你在 C# 中没有那个,IIRC。
关于c# - 如何自动将版本号插入 AssemblyName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021684/
在我正在处理的 WPF 应用程序中尝试使用合并的 ResourceDictionaries 解决问题时,我遇到了这个奇怪的问题。 我在外部 DLL(“通用”)中定义了自定义控件(TextButton、
我正在尝试建立这个问题: Reading a single value from a file in MSBuild 我的目标是在一个地方放置在多个项目中使用的版本号,我还希望其中一个项目的 DLL
给定以下代码: var n1 = new AssemblyName ("TestDll, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=b77a
在 .NET 2.0(以及更高版本,我认为)中,版本容错序列化将成功地从对象所在的程序集的旧版本中反序列化序列化对象。 当我使用十六进制查看器打开这样一个二进制格式的序列化流时(只需简单地拖放到 VS
我需要在不使用 AssemblyName 的情况下解析程序集限定名称,因为我得到 System.IO.FileLoadException(程序集不可用)。 我只管理字符串,不管理程序集。如果我有一个字
如何比较两个 AssemblyName 实例以确定它们是否代表同一个程序集? “等于”方法未被覆盖。 我能想到的一种方法是比较两个实例的“ToString()”结果,但我更喜欢“等于”语法,因为我需要
一段时间以来,我在 Xamarin 的引用中遇到了一些错误。这让我失眠并锁定了我的开发过程。调查应用程序的结构,引用出现并带有警报信号。在Nuget包管理器中显示为已安装,但在编译或部署项目的过程中出
MSDN 文档指出: Version numbers consist of two to four components: major, minor, build, and revision. The
{"Could not load file or assembly 'AssemblyName, PublicKeyToken=null' or one of its dependencies. Th
您要发布的应用程序有两个名称,productName 和 publishName(publishName/AssemblyName 我认为它们是相同的)。您可以在 .csproj 文件中指定这两者。
我很想知道使用相同版本的程序集多次调用 Assembly.Load(AssemblyName) 有什么缺点。运行时是否知道在第一次调用后不要再次加载程序集?如果没有,是否有任何方法可以检测已加载的内容
命令“Add-Migration InitialCreate”生成以下错误消息: Could not load assembly 'MathModelApp'. Ensure it is refere
我正在读一本精通WPF的书,并尝试使用MVVM模式使转换器工作一个简单的 View : 当我尝试运行它时,出现以下异常: System.Windows.Markup.XamlParseExceptio
我继承了一个相当复杂的解决方案的维护,该解决方案根据 #define 标志更改其功能。然后根据需要在不同的构建配置中设置这些标志。代码是用 C# 编写的,改编自早期的 C++ 解决方案,目前首选完全重
我从知名提供商处购买了身份验证证书。 现在我想对程序集进行强命名,然后对其进行数字签名。 这是我到目前为止所做的: 通过运行 sn.exe -p keypair.pfx key.snk 从 pfx 中
我正在使用 Sharp Architecture 中的一些测试库,它们使用 NUnit 2.5.0,而我的项目的其余部分使用 NUnit 2.5.1,因此我在测试项目应用程序配置文件中放置了程序集重定
我一直在研究向 Unity3D 游戏添加模组支持。我是 Unity 的新手(但不是 .NET),所以如果我似乎遗漏了一些明显的东西,请告诉我,因为我可能是。 我希望能够直接从编辑器导出对象,包括自定义
我在这个项目中有一个 C# 项目和一个 App.Config 文件。当我构建源代码时,会在应用程序配置的输出目录中创建一个文件 (AssemblyName.exe.config),但我想要此文件的名称
我有一个 ASP.NET Core 2.0 Razor Pages 项目。我正在使用 Visual Studio 2017。 我已将我们的一个内部程序集添加到项目中(它包含通用定义、类型和函数等)。该
我是一名优秀的程序员,十分优秀!