アセンブリ属性を使用するためのベストプラクティスは何ですか?


163

複数のプロジェクトを持つソリューションがあります。1つのソリューション全体のアセンブリ情報ファイルをリンクして、AssemblyInfo.csファイルを最適化しようとしています。これを行うためのベストプラクティスは何ですか?ソリューション全体のファイルに含める必要がある属性と、プロジェクト/アセンブリ固有の属性はどれですか。


編集:興味がある場合は、フォローアップの質問があります。AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersionの違いは何ですか?

回答:


207

GlobalAssemblyInfo.csというグローバルファイルとAssemblyInfo.csというローカルファイルを使用しています。グローバルファイルには、次の属性が含まれています。

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

ローカルAssemblyInfo.csには、次の属性が含まれています。

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

次の手順を使用して、GlobalAssemblyInfo.csを追加できます。

  • プロジェクトのコンテキストメニューで[ 追加/既存のアイテム... ]を選択します
  • GlobalAssemblyInfo.csを選択します
  • 右側の小さな下向き矢印をクリックしてAdd-Buttonを展開します
  • ボタンのドロップダウンリストで「リンクとして追加」を選択します

古いAssemblyInfo.csファイルを保持する目的は何ですか?GlobalAssemblyInfo.csでビルドバージョンスタンプを自動化すると、ソリューションにあるAssemblyInfo.csファイルがどのように更新されますか?
D3vtr0n 2011年

3
@Devtron個々のAssemblyInfoファイルは、それらが存在するアセンブリに固有の情報を提供する必要があります(上記の例のように、タイトル、説明、カルチャーなど)。製品名やバージョン情報などの一般的なエントリは削除する必要があります(重複しているとコンパイラエラーが発生します)。理想的には、AssemblyInfoファイルはビルドプロセスによって更新されません。
David Keaveny、2011年

1
AssemblyCultureAttributeより良い説明に値します。属性は完全に存在しないはずです(これがサテライトアセンブリでない限り)。衛星アセンブリを大規模に使用する場合、2レベルではなく3レベルのアセンブリ情報ファイル(グローバル、メインアセンブリ、およびこの場合はカルチャのみを指定するサテライトアセンブリ)が必要になる場合があります。
Jirka Hanika 2013

20

私の場合は、Visual Studioソリューションを備えた製品を構築しており、さまざまなコンポーネントを独自のプロジェクトに組み込んでいます。共通の属性は行く。ソリューションには、約35のプロジェクトと、次の属性を持つ共通のアセンブリ情報(CommonAssemblyInfo.cs)があります。

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

AssemblyTitle、AssemblyVersionなどの他の属性は、アセンブリごとに提供されます。アセンブリを構築すると、AssemblyInfo.csとCommonAssemblyInfo.csの両方が各アセンブリに構築されます。これにより、すべてのプロジェクトに共通の属性を設定し、他のプロジェクトには特定の値を設定したい場合の両方の利点が得られます。

お役に立てば幸いです。


これを処理するために、ビルド構成に35以上のエントリがありますか?どちらかと言えば冗長です。2つまたは3つの新しいプロジェクトを追加した場合、バージョニングタスクに追加するまでビルドが壊れますか?
D3vtr0n 2011年

1
@ D3vtr0n、なぜ「ビルド構成」(それはどういう意味ですか)に非常に多くのエントリが必要になるのですか?このファイルは<Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>、共有Common.targetsファイルに含まれている可能性のあるMSBuildディレクティブである各.csprojに含まれていると思います。イェイコードの再利用。
binki 14

15

@JRoppertが提示する解決策は、私がすることとほとんど同じです。唯一の違いは、次の行をローカルのAssemblyInfo.csファイルに配置することです。これらの行はアセンブリごとに異なる可能性があるためです。

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

また、(一般的に)1つのソリューションは単一の製品ライン/リリース可能な製品であるという前提で、ソリューションごとに1つの共通のアセンブリ情報を使用します。共通のアセンブリ情報ファイルには、次のものもあります。

[assembly: AssemblyInformationalVersion("0.9.2.0")]

これにより、Windowsエクスプローラーに表示される「ProductVersion」の値が設定されます。



6

私の意見では、GlobalAssemblyInfo.csを使用することは、それが価値があるよりも厄介です。なぜなら、デフォルトではAssemblyInfo.csを取得するのに対し、すべてのプロジェクトファイルを変更し、すべての新しいプロジェクトを変更する必要があるからです。

グローバルな値(つまり、会社、製品など)の変更については、通常、変更は非常にまれであり、管理が簡単です。DRYを考慮する必要はないと思います。すべてのプロジェクトの値を1回限りで手動で変更する場合は、次のMSBuildスクリプト(MSBuild Extension Packに依存)を実行するだけです。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

3

複数のプロジェクト間でファイルを共有するには、既存のファイルをリンクとして追加できます。

これを行うには、既存のファイルを追加し、ファイルセレクターの[リンクとして追加]をクリックします。(ソース:free.frリンクとして追加

共有ファイルに何を入れるかについては、アセンブリ間で共有されるものを置くことをお勧めします。著作権、会社、おそらくバージョンなど。


1

複数のプロジェクトに単一のAseemblyInfo.csファイルを使用することはお勧めしません。AssemblyInfoファイルには、その特定のアセンブリにのみ関連する情報が含まれています。最も明白な2つの情報は、AssemblyTitleおよびAssemblyVersionです。

より良い解決策はtargets、MSBuildで処理されるファイルを使用して、複数のプロジェクトにアセンブリ属性を「挿入」することです。


20以上のプロジェクトがある場合はどうなりますか?そのため、バージョン管理のために、ビルド構成で20以上のエントリを維持する必要があります。それは本当に不自由なようです。2つまたは3つの新しいプロジェクトを追加するとどうなりますか?それは間違いなくビルドプロセスを壊します...それを解決する方法はありますか?
D3vtr0n 2011年

@ D3vtr0nアイデアは、関連するアセンブリを動的に生成し、プロジェクトごとに個別の構成を維持しないことだと思います。コミュニティタスクはそのケースを処理すると思います。
ローマ

1

私が便利だと思ったのは、ビルド前の段階でトークン置換を適用してAssemblyVersion要素(など)を生成することです。

私はTortoiseSvnを使用しSubWCRev.exeていますが、テンプレートをにAssemblyInfo.wcrev変換するのは簡単AssemblyInfo.csです。テンプレートの関連する行は次のようになります。

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

3番目の要素はリビジョン番号です。4番目の要素を使用して、新しいファイルまたは変更されたファイルをコミットすることを忘れていないことを確認します(4番目の要素は、すべて問題なければ00です)。

ちなみに、AssemblyInfo.wcrevバージョンコントロールに追加して、これを使用する AssemblyInfo.cs場合は無視してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.