什么是使用Assembly Attributes的最佳实践?

我有多个项目的解决scheme。 我正在尝试通过链接一个解决scheme宽的程序集信息文件来优化AssemblyInfo.cs文件。 这样做的最佳做法是什么? 哪些属性应该在解决scheme的宽文件中,哪些是项目/程序集特定的?


编辑:如果你有兴趣有一个后续问题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:

  • 在项目的上下文菜单中selectAdd / Existing Item …
  • selectGlobalAssemblyInfo.cs
  • 点击右边的那个小箭头展开Add-Button
  • 在button下拉列表中select“添加为链接”

就我而言,我们正在构build一个产品,我们拥有一个Visual Studio解决scheme,并在各自的项目中包含各种组件。 共同的属性去。 在解决scheme中,大约有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等,我们提供每个组件的基础上。 构build程序集时,AssemblyInfo.cs和CommonAssemblyInfo.cs都被构build到每个程序集中。 这给了我们两全其美的世界,您可能想要为所有项目提供一些共同的属性,并为其他项目提供具体的价值。

希望有所帮助。

@JRoppert提供的解决scheme几乎与我所做的一样。 唯一的区别是我将下面的行放在本地的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)] 

我也(通常)使用一个通用的组件信息解决scheme,假设一个解决scheme是一个单一的产品线/可释放的产品。 常见的程序集信息文件也有:

 [assembly: AssemblyInformationalVersion("0.9.2.0")] 

它将设置Windows资源pipe理器显示的“ProductVersion”值。

MSBuild社区任务包含一个名为AssemblyInfo的自定义任务,您可以使用它来生成您的assemblyinfo.cs。 它需要手动编辑你的csproj文件来使用,但是是值得的。

要在多个项目之间共享文件,您可以将现有文件添加为链接。

要做到这一点,添加一个现有的文件,并点击文件select器中的“添加为链接”。 添加为链接http://laurent.etiemble.free.fr/dotclearhttp://img.dovov.comAddLinkedFile03_tn.png

至于怎么把共享文件,我会build议把东西,将共享跨组件。 像版权,公司,也许版本。

在我看来,使用GlobalAssemblyInfo.cs更麻烦,因为您需要修改每个项目文件,并记住修改每个新项目,而默认情况下会得到一个AssemblyInfo.cs。

对于全球价值(即公司,产品等)的变化,这些变化通常是非常频繁和简单的pipe理,我不认为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> 

build议不要使用单个AseemblyInfo.cs文件用于多个项目。 AssemblyInfo文件包含可能仅与特定程序集相关的信息。 两个最明显的信息是AssemblyTitleAssemblyVersion

更好的解决scheme可能是使用由MSBuild处理的targets文件,以便将“assembly”属性“注入”到多个项目中。

有一件事我发现有用的是通过在预生成阶段应用标记replace来生成AssemblyVersion元素(等)。

我使用TortoiseSvn,很容易使用它的SubWCRev.exe将模板AssemblyInfo.wcrev变成AssemblyInfo.cs 。 模板中的相关行可能如下所示:

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

第三个元素是修订号。 我使用第四个元素来检查我没有忘记提交任何新的或更改的文件(第四个元素是00,如果一切正常的话)。

顺便说一句,将AssemblyInfo.wcrev添加到您的版本控制,并忽略 AssemblyInfo.cs如果你使用这个。