代码之家  ›  专栏  ›  技术社区  ›  dotNET

在启动屏幕上写入程序集版本

  •  2
  • dotNET  · 技术社区  · 7 年前

    我跟着Kent Boogaart的 excellent article 关于如何将动态内容添加到初始屏幕。从某种意义上讲,我现在可以在启动屏幕上看到版本号。然而,问题是本文使用了 $(Version) 财产,在我的情况下是 1.0.0.0

    我正在使用 shared AssemblyInfo.vb 并且需要从这个文件中获取下一个主要/次要/构建/修订号,以便在启动屏幕上绘制它们。共享的AssemblyInfo文件包含一个版本号,如 2.5.* . 我需要MSBuild生成的实际数字( 2.5.abc.xyz ).

    我想过在 UsingTask 从程序集获取版本号,但由于此任务已运行 之前 在构建过程中,程序集还没有在以下构建中生成的版本号。此外,组件可能根本不存在(例如 清洁的 命令)。

    我安装了MSBuild社区任务,但除了 SvnVersion 任务

    有人能帮我把要生成的版本号发送到我的 使用任务 ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   dotNET    7 年前

    最后对于其他尝试这样做的人,假设您使用的是驻留在解决方案目录中的共享AssemblyInfo(它也可以用于默认AssemblyInfo,但您需要相应地调整路径和文件名),以下是步骤:

    1. 下载并安装 MSBuild Community Tasks
    2. 添加一个目标文件(一个简单的XML文件 .targets
    3. 添加 UsingTask 出现在Kent Boogaart的文章中,我在问题中链接到了这个文件。这将在splash图像上执行实际的版本写入。
    4. 使用 <Version> , <FileUpdate> <AddTextToImage> 任务(前两个在MSBuild中可用,第三个来自 使用任务 我们在步骤3)中添加了将新版本号写入共享AssemblyInfo文件和splash图像的功能。

    .目标 文件如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <UsingTask TaskName="AddTextToImage" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
        <ParameterGroup>
          <InputPath ParameterType="System.String" Required="true" />
          <OutputPath ParameterType="System.String" Required="true" />
          <TopMiddlePoint ParameterType="System.String" Required="true" />
          <Text1 ParameterType="System.String" Required="true" />
          <Text2 ParameterType="System.String" Required="false" />
          <Text3 ParameterType="System.String" Required="false" />
        </ParameterGroup>
        <Task>
          <Reference Include="WindowsBase" />
          <Reference Include="PresentationCore" />
          <Reference Include="PresentationFramework" />
          <Reference Include="System.Xaml" />
          <Using Namespace="System" />
          <Using Namespace="System.Globalization" />
          <Using Namespace="System.IO" />
          <Using Namespace="System.Windows" />
          <Using Namespace="System.Windows.Media" />
          <Using Namespace="System.Windows.Media.Imaging" />
          <Code Type="Fragment" Language="cs">
            <![CDATA[         
                  var originalImageSource = BitmapFrame.Create(new Uri(InputPath));
    
                  var visual = new DrawingVisual();
    
                  using (var drawingContext = visual.RenderOpen())
                  {
                    drawingContext.DrawImage(originalImageSource, new Rect(0, 0, originalImageSource.PixelWidth, originalImageSource.PixelHeight));
    
                    var typeFace = new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Bold, FontStretches.Normal);
                    var formattedText = new FormattedText(Text1, System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, 18, Brushes.Red);
                    var topMiddlePoint = Point.Parse(TopMiddlePoint);
                    var point = new Point(topMiddlePoint.X - (formattedText.Width / 2), topMiddlePoint.Y);
                    drawingContext.DrawText(formattedText, point);
    
                    if(!string.IsNullOrEmpty(Text2))
                    {
                      formattedText = new FormattedText(Text2, System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, 18, Brushes.Red);
                      topMiddlePoint.Y += formattedText.Height + 5;
                      point = new Point(topMiddlePoint.X - (formattedText.Width / 2), topMiddlePoint.Y);
                      drawingContext.DrawText(formattedText, point);
                    }
    
                    if(!string.IsNullOrEmpty(Text3))
                    {
                      formattedText = new FormattedText(Text3, System.Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, typeFace, 18, Brushes.Red);
                      topMiddlePoint.Y += formattedText.Height + 5;
                      point = new Point(topMiddlePoint.X - (formattedText.Width / 2), topMiddlePoint.Y);
                      drawingContext.DrawText(formattedText, point);
                    }
    
                    drawingContext.Close();
                  }
    
                  var renderTargetBitmap = new RenderTargetBitmap(originalImageSource.PixelWidth, originalImageSource.PixelHeight, originalImageSource.DpiX, originalImageSource.DpiY, PixelFormats.Pbgra32);
    
                  renderTargetBitmap.Render(visual);
    
                  var bitmapFrame = BitmapFrame.Create(renderTargetBitmap);
    
                  BitmapEncoder encoder = new PngBitmapEncoder();
    
                  encoder.Frames.Add(bitmapFrame);
    
                  using (var stream = File.OpenWrite(OutputPath))
                  {
                    encoder.Save(stream);
                    stream.Close();
                  }
                ]]>
          </Code>
        </Task>
      </UsingTask>
    
      <PropertyGroup>
        <MajorVersion>2</MajorVersion>
        <MinorVersion>5</MinorVersion>
      </PropertyGroup>
    
      <Target Name="BeforeBuild">
        <Version BuildType="Automatic" RevisionType="Automatic" Major="$(MajorVersion)" Minor="$(MinorVersion)">
          <Output TaskParameter="Major" PropertyName="Major" />
          <Output TaskParameter="Minor" PropertyName="Minor" />
          <Output TaskParameter="Build" PropertyName="Build" />
          <Output TaskParameter="Revision" PropertyName="Revision" />
        </Version>
    
        <FileUpdate Files="$(SolutionDir)SharedAssemblyInfo.vb"
                Regex="Assembly: AssemblyVersion\(&quot;\d+\.\d+((\.\*)|(\.\d+\.\d+))?&quot;\)"
                ReplacementText="Assembly: AssemblyVersion(&quot;$(Major).$(Minor).$(Build).$(Revision)&quot;)" />
    
        <FileUpdate Files="$(SolutionDir)SharedAssemblyInfo.vb"
                Regex="Assembly: AssemblyFileVersion\(&quot;\d+\.\d+((\.\*)|(\.\d+\.\d+))?&quot;\)"
                ReplacementText="Assembly: AssemblyFileVersion(&quot;$(Major).$(Minor).$(Build).$(Revision)&quot;)" />
    
        <SvnVersion LocalPath=".">
          <Output TaskParameter="Revision" PropertyName="SvnRevision" />
        </SvnVersion>
    
        <AddTextToImage InputPath="$(ProjectDir)Resources\Splash.png"
                        OutputPath="$(ProjectDir)Resources\SplashWithVersion.png"
                        TopMiddlePoint="250,150"
                        Text1="$(Major).$(Minor).$(Build).$(Revision)"
                        Text2="SVN Version: $(SvnRevision)" />
    
        <Message Text="Updated version number on splash screen to: $(Major).$(Minor).$(Build).$(Revision)" Importance="high"/>
      </Target>
    </Project>
    

    这将更新AssemblyInfo和输出图像。请注意,您必须将输出图像标记为 SplashScreen (作为生成操作)在Visual Studio中。还要注意的是,我正在启动屏幕上编写程序集版本和SVN修订号。你可能需要根据自己的需要进行调整。