簡體   English   中英

使用程序集屬性的最佳實踐是什么?

[英]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:

  • Select Add/Existing Item...在項目的上下文菜單中
  • Select GlobalAssemblyInfo.cs
  • 通過單擊右側的那個小向下箭頭來展開添加按鈕
  • Select 按鈕下拉列表中的“添加為鏈接”

在我的例子中,我們正在構建一個產品,我們有一個 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 文件包含可能僅與該特定程序集相關的信息。 兩條最明顯的信息是AssemblyTitleAssemblyVersion

更好的解決方案可能是使用由 MSBuild 處理的targets文件,以便將程序集屬性“注入”多個項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM