web-dev-qa-db-ja.com

.NET ClickOnceアプリケーションで発行バージョンをアセンブリバージョンに同期するにはどうすればよいですか?

私のC#ClickOnceアプリケーションでは、[プロジェクト]-> プロパティ-> 公開タブに自動インクリメントされた公開バージョンがあります。そのバージョンをメニューに表示したいヘルプ-> バージョン情報ボックスですが、使用しているコードがアセンブリバージョンにアクセスしているようです。これは異なります。

アセンブリバージョンは、プロジェクト-> プロパティ-> アプリケーション->アセンブリ情報ダイアログで手動で変更できます。そのため、今のところ、公開する前に、公開バージョンをアセンブリバージョンにコピーしているので、ダイアログにはアプリケーションの現在のバージョンが表示されます。これを行うためのより良い方法があるはずです。

私が本当にやりたいのは、正確で自動更新された、コードでアクセス可能なバージョン番号を用意することだけです。

アセンブリのバージョン番号にアクセスするために使用しているコードは次のとおりです。

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

別の方法は、公開バージョンにアクセスするコードを見つけることです。

35
Randy Gamage

私の経験では、sylvanaarの最後の行は進むべき道のように見えます。ただし、デプロイされたバージョンのアプリケーションでのみ使用可能であることに注意してください。デバッグの目的で、次のようなものが必要になる場合があります。

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

        return "Debug";
    }
22
Richard Dunlap

.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
10
sylvanaar

実装の詳細の一部が私には明らかではなかったので、Sylvanaarの答えを拡張したいと思います。そう:

  1. 次の場所にあるコミュニティビルドタスクを手動でインストールします。 https://github.com/loresoft/msbuildtasks/releases 注:パッケージをクリーンアップする場合は、nugetでインストールしないでください。ビルドは、取得する前に失敗します。 msbuildtasksはビルドファイル内のタスクとして参照されるため、パッケージを復元するチャンス。これらを.buildというソリューションファイルの隣のフォルダーに置きます

  2. VersionInfo.csという名前のプロジェクトプロパティフォルダーに完全に空のファイルを追加します

3 AssemblyInfo.csに存在する場合は、これらの行を削除します

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

4csprojファイルを変更します

  <!-- 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();
}
3
Jahmic

VBで使用するためにsylvanaarのソリューションを変更しました。

- 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'"

また、CompanyとProductをそれぞれClickOnce PublisherNameとProductNameと同期し、現在の日付に基づいて著作権を生成しました。

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

これをvbprojファイルに追加することになりました。最初にMSBuildTasksNuGetパッケージをインストールする必要があります。

  <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>
3
bcwhims

逆に、アセンブリバージョン(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>
2
shapkin