アセンブリ属性を使用するためのベスト プラクティスは何ですか?
-
09-06-2019 - |
質問
複数のプロジェクトを使用した解決策があります。1 つのソリューション全体のアセンブリ情報ファイルをリンクすることで、AssemblyInfo.cs ファイルを最適化しようとしています。これを行うためのベストプラクティスは何ですか?どの属性をソリューション全体のファイルに含める必要があり、どの属性がプロジェクト/アセンブリ固有のものですか?
編集:ご興味がございましたら、フォローアップの質問があります AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion の違いは何ですか?
解決
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 を選択します
- 右側の小さな下矢印をクリックして追加ボタンを展開します。
- ボタンのドロップダウンリストで「リンクとして追加」を選択します
他のヒント
私の場合、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 の両方が各アセンブリに組み込まれます。これにより、すべてのプロジェクトに共通の属性を持ち、他のプロジェクトには特定の値を持ちたい場合に、両方の長所を得ることができます。
それが役立つことを願っています。
@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」値が設定されます。
MSBuild コミュニティ タスク には、AssemblyInfo.cs の生成に使用できる AssemblyInfo というカスタム タスクが含まれています。使用するには csproj ファイルを少し手動で編集する必要がありますが、それだけの価値はあります。
私の意見では、GlobalAssemblyInfo.cs を使用することは、価値がある以上に面倒です。デフォルトで AssemblyInfo.cs を取得するのに対し、すべてのプロジェクト ファイルを変更し、すべての新しいプロジェクトを忘れずに変更する必要があるからです。
グローバル値の変更 (つまり、会社、製品など) 変更は通常それほど頻繁ではなく、管理が簡単だとは思えません ドライ 検討すべきである。次の MSBuild スクリプトを実行するだけです ( MSBuild 拡張パック) すべてのプロジェクトの値を 1 回限りで手動で変更する場合:
<?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>
複数のプロジェクト間でファイルを共有するには、既存のファイルをリンクとして追加します。
これを行うには、既存のファイルを追加し、ファイル セレクターで [リンクとして追加] をクリックします。
(ソース: free.fr)
共有ファイルに何を入れるかについては、アセンブリ間で共有されるものを入れることをお勧めします。著作権、会社、おそらくバージョンなど。
複数のプロジェクトに単一の AseemblyInfo.cs ファイルを使用することはお勧めできません。AssemblyInfo ファイルには、その特定のアセンブリにのみ関連する可能性のある情報が含まれています。最も明白な情報は次の 2 つです。 AssemblyTitle
そして AssemblyVersion
.
より良い解決策は、使用することかもしれません targets
ファイルは、アセンブリ属性を複数のプロジェクトに「挿入」するために MSBuild によって処理されます。
私が便利だと感じた点の 1 つは、ビルド前のフェーズでトークン置換を適用して AssemblyVersion 要素 (など) を生成することです。
私は TortoiseSvn を使用していますが、その使い方は簡単です SubWCRev.exe
テンプレートを変えるには AssemblyInfo.wcrev
の中へ AssemblyInfo.cs
. 。テンプレート内の関連する行は次のようになります。
[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]
3 番目の要素はリビジョン番号です。4 番目の要素を使用して、新しいファイルや変更されたファイルのコミットを忘れていないかどうかを確認します (すべて OK の場合、4 番目の要素は 00 です)。
ちなみに追加 AssemblyInfo.wcrev
バージョン管理と 無視する AssemblyInfo.cs
これを使えば。