使用汇编属性的最佳实践是什么?

我有一个多项目的解决方案。我试图通过链接一个解决方案范围的汇编信息文件来优化 AssemblyInfo.cs 文件。这样做的最佳实践是什么?解决方案范围的文件中应该包含哪些属性,哪些属性是特定于项目/程序集的?


编辑: 如果你有兴趣,有一个后续问题 AssemblyVersion、 AssemblyFileVersion 和 AssemblyInformationalVersion 之间有什么区别?

54178 次浏览

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

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

我们使用了一个名为 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
  • 通过单击右手边的小向下箭头展开 Add-Button
  • 在按钮下拉列表中选择“添加为链接”

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

要做到这一点,添加一个现有的文件,并点击“添加为链接”在文件选择器。Add As Link
(来源: 自由)

至于在共享文件中放入什么,我建议放入跨程序集共享的内容。比如版权,公司,或者版本。

在我的例子中,我们正在构建一个产品,其中我们有一个 VisualStudio 解决方案,在它们自己的项目中包含各种组件。共同的属性去。在这个解决方案中,有大约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 都被构建到每个程序集中。这给了我们最好的两个世界,您可能希望有一些共同的属性为所有项目和特定的价值为其他一些。

希望能帮上忙。

MSBuild Community Tasks 包含一个名为 AssemblyInfo 的自定义任务,您可以使用该任务来生成 AssemblyInfo.cs。使用它需要对 csproj 文件进行一些手工编辑,但是这是值得的。

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

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

在我看来,使用 globalassemblyinfo.cs 的麻烦大于它的价值,因为您需要修改每个项目文件,并记住修改每个新项目,而您在默认情况下得到的是 AssemblyInfo.cs。

对于全局价值的变化(如公司,产品等) ,这些变化通常是如此的不频繁和简单的管理,我不认为 干的应该是一个考虑因素。当您想一次性手动更改所有项目中的值时,只需运行以下 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>

我发现有一点很有用,那就是通过在预构建阶段应用令牌替换来生成 AssemblyVersion 元素(等等)。

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

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

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

顺便说一下,添加 AssemblyInfo.wcrev到您的版本控制和 忽略 AssemblyInfo.cs,如果您使用这一点。