Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在AssemblyName中自动插入版本号_C#_.net_Dll_Msbuild_Version - Fatal编程技术网

C# 如何在AssemblyName中自动插入版本号

C# 如何在AssemblyName中自动插入版本号,c#,.net,dll,msbuild,version,C#,.net,Dll,Msbuild,Version,我试图在这个问题的基础上: 我的目标是有一个单独的位置来放置几个项目中使用的版本号,并且我还希望在其中一个项目的DLL文件名中有一部分版本号 基于上面的问题,我已经得到了第一部分,但是我对第二部分有困难,希望得到一些指导 在我的解决方案中,我设置了一个名为Version.txt的纯文本文件,其中只包含我的完整版本号: 1.1.0.0 在我的两个项目中,我打开了它们的AssemblyInfo.cs文件并删除了AssemblyVersion和AssemblyFileVersion项,然后修改了这两

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

我的目标是有一个单独的位置来放置几个项目中使用的版本号,并且我还希望在其中一个项目的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>
在此之前,我将csproj文件顶部和“重新定义”中的重命名为独特的名称,以便于搜索(例如“dllfileoriginal”与“dllfilemodified”)

查看输出日志,我找不到任何对修改文本的引用;在输出中,它仍然是dllfileoriginal

在执行WriteListFile任务之后,似乎构建了以下目标:

  • 增量清洁(已完成)
  • 构建后事件
  • 核心构建
  • 后建
  • 建造
这些文件中没有对任何DLL名称的引用


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

目标名称显示在IDE属性页编辑器的“配置属性”选项卡下的“常规”页上。我没有一个方便的来查找你的名字,但你可以通过改变IDE中的空白到XXXX和保存。然后在版本控制commit reviewer中查看差异,并查看属性的名称。在这种情况下,编辑该行以将XXXX更改为
$(OutputPath)$(AssemblyName).v$(VersionNumberShort)

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


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

这对我很有效,它解决了在构建时将版本信息字符串附加到文件名的看似简单的问题

首先,生成后事件:

(右键单击项目->属性->生成事件->编辑生成后…)

$(TargetPath)“版本”>$(TargetDir)text.txt

set/p version=为什么不在目标或后构建目标的末尾添加一个元素来重命名二进制文件?@PeterRitchie-如果对程序集进行签名,它将不起作用。另外,问题是关于构造新路径,而不是什么时候这样做……为什么要在程序集名称中使用版本?您从中得到了什么好处?在我们的例子中,我们观察到需要使用同一DLL的多个版本部署软件。例如,假设DLL A和B都依赖于DLL X版本1.0。然后我们生成了DLL X的1.1版本,我们开始更新DLL B以使用X1.1,但A仍然使用X1.0,没有更新计划。在这种情况下,我们需要同时使用A、B、x1.0和x1.1部署最终产品。无论如何,这不是我们可以控制的;就是这样。我希望能够做到的是将这个数字集中到一个点上。谢谢。添加链接的AssemblyVersionl.cs无效吗?恐怕我找不到任何常规选项卡。我查看了项目的属性页以及Visual Studio 2012中的属性窗格。FormatVersion看起来将根据MSDN页面将数字附加在一起,而不是将它们分开。我也在考虑定义;我相信C#确实支持将它们传入,但我不需要在源文件中对它们做任何处理,因为我已经用WriteListFile生成了Version.cs文件,但这似乎是另一个好主意。谢谢。@jia103我在上面的回答中澄清了位置。谢谢更新。那个屏幕看起来很熟悉;看起来您使用的是不同版本的Visual Studio;我在2012年,我看不到这一点。我在.csproj文件中也没有看到类似的内容;我所有的都在那里。也许你需要的就是
?尝试将其更改为XXX,看看它是否显示在您期望的位置。问题是,我已经尝试在其中插入属性:dllname.v$(VersionNumber)。问题是VersionNumber似乎要到以后才能获得值;在解决这个问题时,它显然仍然是空的。我最终得到了一个名为dllname.v.DLL的DLL,这不是我想要的。到目前为止,它看起来仍然是我唯一的方法,限制它可能不适用于已签名的程序集。
<RootNamespace>dllfile</RootNamespace>
<AssemblyName>dllfile.v$(VersionNumber)</AssemblyName>
<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;)]" />
<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>
<Target Name="BeforeBuild">
    ...
    <WriteLinesToFile ... />
    <PropertyGroup>
      <AssemblyName>dllfile.v$(VersionNumber)</AssemblyName>
    </PropertyGroup>
</Target>
msbuild /target:clean projfile.csproj
msbuild /verbosity:diag projfile.csproj > out.txt
$(TargetPath) "version" > $(TargetDir)text.txt
set /p version= <$(TargetDir)text.txt
copy $(TargetPath) $(TargetDir)$(TargetName)_%version%.exe
del $(TargetDir)text.txt
[<EntryPoint>]
let main argv = 

    let version = argv.Length = 1 && argv.[0] = "version"
    if version then
        let version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()
        do stdout.WriteLine(version)
        do stdout.Flush()
    else 
        try
        //...