[英]What are the best practices for using Assembly Attributes?
我有一個包含多個項目的解決方案。 我正在嘗試通過鏈接一個解決方案范圍的程序集信息文件來優化 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:
在我的例子中,我們正在構建一個產品,我們有一個 Visual Studio 解決方案,在他們自己的項目中包含各種組件。 共同屬性 go。 在解決方案中,大約有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)]
我還(通常)為每個解決方案使用一個通用的裝配信息,假設一個解決方案是一個單一的產品線/可發布產品。 通用程序集信息文件還具有:
[assembly: AssemblyInformationalVersion("0.9.2.0")]
這將設置 Windows Explorer 顯示的“ProductVersion”值。
MSBuild 社區任務包含一個名為 AssemblyInfo 的自定義任務,您可以使用它來生成您的 assemblyinfo.cs。 它需要對您的 csproj 文件進行一點手工編輯才能使用,但這是值得的。
在我看來,使用 GlobalAssemblyInfo.cs 比它的價值更麻煩,因為您需要修改每個項目文件並記住修改每個新項目,而默認情況下您會得到一個 AssemblyInfo.cs。
對於全局值(即公司、產品等)的更改,這些更改通常很少且易於管理,我認為DRY不應該是一個考慮因素。 當您想一次性手動更改所有項目中的值時,只需運行以下 MSBuild 腳本(依賴於MSBuild 擴展包):
<?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 )
至於在共享文件中放置什么,我建議放置將跨程序集共享的東西。 諸如版權,公司,也許是版本之類的東西。
我發現有用的一件事是通過在預構建階段應用令牌替換來生成 AssemblyVersion 元素(等)。
我使用 TortoiseSvn,很容易使用它的SubWCRev.exe
將模板AssemblyInfo.wcrev
轉換為AssemblyInfo.cs
。 模板中的相關行可能如下所示:
[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]
第三個元素是修訂號。 我使用第四個元素來檢查我沒有忘記提交任何新的或更改的文件(如果一切正常,第四個元素是 00)。
順便說一句,將AssemblyInfo.wcrev
添加到您的版本控制中,如果您使用它,請忽略AssemblyInfo.cs
。
不建議對多個項目使用單個 AseemblyInfo.cs 文件。 AssemblyInfo 文件包含可能僅與該特定程序集相關的信息。 兩條最明顯的信息是AssemblyTitle
和AssemblyVersion
。
更好的解決方案可能是使用由 MSBuild 處理的targets
文件,以便將程序集屬性“注入”多個項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.