如何同步在.NET ClickOnce应用程序发布版本的程序集版本?(How to synchron

2019-07-19 22:49发布

在我的C#ClickOnce应用程序,有一个自动递增的项目发布版本- > 属性 - > 发布选项卡。 我想,以显示我的菜单帮助该版本- > 关于框,但我使用显然是代码访问程序集的版本,这是不同的。

大会版本可以手动在项目中改变- > 属性 - > 应用程序 - >程序集信息对话框。 所以现在,每前我发表我一直在复制发布版本的程序集版本,时间,让我的对话框显示应用程序的当前版本。 必须有一个更好的方式来做到这一点。

我真正想要做的是有一个准确,自动更新,代码访问的版本号。

下面是我使用访问组件的版本号的代码:

public string AssemblyVersion
{
    get
    {
        return Assembly.GetExecutingAssembly().GetName().Version.ToString();
    }
}

另一种方法是找到访问发布的版本代码。

Answer 1:

希尔瓦纳的最后一行看起来像是去,在我的经验的方式; 但是,这只是提供给应用程序的部署版本的警告。 为了进行调试,你可能想是这样的:

    static internal string GetVersion()
    {
        if (ApplicationDeployment.IsNetworkDeployed)
        {
            return ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString();
        }

        return "Debug";
    }


Answer 2:

我修改了我的.csproj文件更新程序集的版本。 我创建了一个名为“公开发布”此配置,但要做到这一点不是必需的。

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
  <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">
    <MSBuildCommunityTasksPath>$(SolutionDir)Tools\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
  </PropertyGroup>
  <!-- Required Import to use MSBuild Community Tasks -->
  <Import Project="$(SolutionDir)Tools\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="'$(BuildingInsideVisualStudio)' == 'true'" />
  <Target Name="BeforeCompile" Condition="'$(BuildingInsideVisualStudio)|$(Configuration)' == 'true|PublicRelease'">
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
      <Output TaskParameter="OutputVersion" PropertyName="AssemblyVersionToUse" />
    </FormatVersion>
    <AssemblyInfo CodeLanguage="CS" OutputFile="$(ProjectDir)Properties\VersionInfo.cs" AssemblyVersion="$(AssemblyVersionToUse)" AssemblyFileVersion="$(AssemblyVersionToUse)" />
  </Target>

已发布的版本可能是:

ApplicationDeployment.CurrentDeployment.CurrentVersion


Answer 3:

我修改希尔瓦纳对与VB使用的解决方案:

- Microsoft.VisualBasic.targets instead of Microsoft.CSharp.targets
- CodeLanguage="VB" instead of CodeLanguage="CS" 
- AssemblyInfo.vb instead of VersionInfo.cs

在路径的不同:

- $(SolutionDir).build instead of $(SolutionDir)Tools\MSBuildCommunityTasks
- $(ProjectDir)AssemblyInfo.vb instead of $(ProjectDir)Properties\VersionInfo.cs

和除去的条件:

- Condition="'$(BuildingInsideVisualStudio)' == 'true'"
- Condition="'$(BuildingInsideVisualStudio)|$(Configuration)' == 'true|PublicRelease'"

我也是同步的公司和产品使用ClickOnce的PublisherName和产品名称分别基于当前日期产生版权所有:

- AssemblyCompany="$(PublisherName)"
- AssemblyProduct="$(ProductName)" 
- AssemblyCopyright="© $([System.DateTime]::Now.ToString(`yyyy`)) $(PublisherName)"

最后我加入这个我vbproj文件。 它要求MSBuildTasks NuGet包先安装:

  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
  <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">
    <MSBuildCommunityTasksPath>$(SolutionDir).build</MSBuildCommunityTasksPath>
  </PropertyGroup>
  <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" Condition="'$(BuildingInsideVisualStudio)' == 'true'" />
  <Target Name="BeforeCompile">  
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
      <Output TaskParameter="OutputVersion" PropertyName="AssemblyVersionToUse" />
    </FormatVersion>
    <AssemblyInfo CodeLanguage="VB" OutputFile="$(ProjectDir)AssemblyInfo.vb" AssemblyVersion="$(AssemblyVersionToUse)" AssemblyFileVersion="$(AssemblyVersionToUse)" AssemblyCompany="$(PublisherName)" AssemblyProduct="$(ProductName)" AssemblyCopyright="© $([System.DateTime]::Now.ToString(`yyyy`)) $(PublisherName)"/>
  </Target>

我不知道有多少项目文件的事项中的位置,但我将此添加到我的项目文件的末尾,就在:

</Project>


Answer 4:

我想扩大希尔瓦纳的答案,因为一些实施细节不明显给我。 所以:

  1. 手动安装在发现社会的构建任务: https://github.com/loresoft/msbuildtasks/releases注意:如果你清理你的包,作为构建会得到一个机会来恢复软件包之前失败不要安装的NuGet,因为msbuildtasks被作为构建文件任务引用。 我把这些文件夹旁边名为.build解决方案文件

  2. 一个完全空的文件添加到您的项目特性文件夹,名为VersionInfo.cs

3,如果他们在AssemblyInfo.cs中存在删除这些线

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

4修改您的csproj文件

  <!-- Include the build rules for a C# project. -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

  <!--INSERT STARTS HERE-->
  <!--note the use of .build directory-->
  <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">
    <MSBuildCommunityTasksPath>$(SolutionDir)\.build\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
  </PropertyGroup>
  <!-- Required Import to use MSBuild Community Tasks -->
  <Import Project="$(SolutionDir)\.build\MSBuild.Community.Tasks.targets" Condition="'$(BuildingInsideVisualStudio)' == 'true'" />
  <Target Name="BeforeCompile" Condition="'$(BuildingInsideVisualStudio)|$(Configuration)' == 'true|Release'">
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
      <Output TaskParameter="OutputVersion" PropertyName="AssemblyVersionToUse" />
    </FormatVersion>
    <AssemblyInfo CodeLanguage="CS" OutputFile="$(ProjectDir)Properties\VersionInfo.cs" AssemblyVersion="$(AssemblyVersionToUse)" AssemblyFileVersion="$(AssemblyVersionToUse)" />
  </Target>

5使用的方法类似下面访问版本的文字:

public string Version()
{
    Version version = null;

    if (ApplicationDeployment.IsNetworkDeployed)
    {
        version = ApplicationDeployment.CurrentDeployment.CurrentVersion;
    }
    else
    {
        version = typeof(ThisAddIn).Assembly.GetName().Version;
    }

    return version.ToString();
}


Answer 5:

我做到了周围的其他方法,使用通配符我的程序集的版本 - 1.0 * - 这样的Visual Studio / MSBuild的自动生成一个版本号:

// AssemblyInfo.cs    
[assembly: AssemblyVersion("1.0.*")]

然后,我添加了下面AfterCompile目标ClickOnce的项目向大会指定版本同步PublishVersion:

<Target Name="AfterCompile">
    <GetAssemblyIdentity AssemblyFiles="$(IntermediateOutputPath)$(TargetFileName)">
      <Output TaskParameter="Assemblies" ItemName="TargetAssemblyIdentity" />
    </GetAssemblyIdentity>
    <PropertyGroup>
      <PublishVersion>%(TargetAssemblyIdentity.Version)</PublishVersion>
    </PropertyGroup>
</Target>


文章来源: How to synchronise the publish version to the assembly version in a .NET ClickOnce application?