使用程序集属性的最佳实践是什么?


163

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


编辑:如果您有后续问题,AssemblyVersion,AssemblyFileVersion和AssemblyInformationalVersion之间有什么区别?

Answers:


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
  • 通过单击右侧的小向下箭头来展开添加按钮
  • 在按钮下拉列表中选择“添加为链接”

保留旧的AssemblyInfo.cs文件的目的是什么?当我在GlobalAssemblyInfo.cs中自动构建版本标记时,如何更新解决方案中的AssemblyInfo.cs文件?
D3vtr0n 2011年

3
@Devtron单独的AssemblyInfo文件应提供它们所驻留的程序集的唯一信息(例如,标题,说明和区域性,如上例所示)。常用条目,例如产品名称和版本信息,应删除(如果重复,将导致编译器错误)。理想情况下,组装过程将不会更新AssemblyInfo文件。
David Keaveny

1
AssemblyCultureAttribute值得更好的解释。最好完全不存在该属性(除非这是附属程序集)。大规模使用卫星装配体时,可能需要三层而非两层的装配体信息文件(在这种情况下,全局,主装配体和附属装配体仅指定区域性)。
Jirka Hanika,

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个新项目该怎么办,直到您将它们添加到Versioning任务后,构建过程才会中断吗?
D3vtr0n 2011年

1
@ D3vtr0n,为什么“构建配置”(您的意思是)需要那么多条目?我假设此文件包含在每个.csproj至<Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>MSBuild指令中,该MSBuild指令甚至可能位于共享Common.targets文件中。是的代码重用。
binki 2014年

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)]

我还(通常)在每个解决方案中使用一个通用的装配信息,并假设一个解决方案是单个产品线/可发布产品。通用程序集信息文件还具有:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

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


8

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


6

在我看来,使用GlobalAssemblyInfo.cs麻烦多于其应有的价值,因为您需要修改每个项目文件并记住要修改每个新项目,而默认情况下会获得AssemblyInfo.cs。

对于全局值的更改(即公司,产品等),更改通常如此罕见且易于管理,我认为DRY不应该考虑。如果要一次性更改所有项目中的值,只需运行以下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文件包含可能仅与该特定程序集相关的信息。最明显的两个信息是AssemblyTitleAssemblyVersion

一种更好的解决方案可能是使用targets由MSBuild处理的文件,以便将程序集属性“注入”到多个项目中。


如果您有20多个项目怎么办?这需要我在构建配置中维护20多个条目,仅用于版本控制。那真是la脚。如果我添加2或3个新项目怎么办?那肯定会破坏构建过程...任何想法如何解决这个问题?
D3vtr0n 2011年

@ D3vtr0n我认为该想法是动态生成相关的程序集,而不是为每个项目维护单独的配置。我认为,社区任务可以处理这种情况。
2013年

1

我发现有用的一件事是通过在预构建阶段应用令牌替换来生成AssemblyVersion元素(等)。

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

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

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

顺便说一句,添加AssemblyInfo.wcrev到您的版本控件,如果使用此控件,则忽略 AssemblyInfo.cs它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.