it-swarm.cn

使用装配属性的最佳做法是什么?

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


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

160
Jakub Šturc

我们使用名为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
  • 单击右侧的小向下箭头展开“添加”按钮
  • 在按钮下拉列表中选择“添加为链接”
204
JRoppert

就我而言,我们正在构建一个产品,我们有一个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都内置于每个程序集中。这为我们提供了两个世界中最好的东西,您可能希望为所有项目提供一些共同属性,为其他项目提供特定值。

希望有所帮助。

19
Krishna

@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”值。

13
Scott Dorman

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

8
jlew

在我看来,使用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>
5
Schneider

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

为此,请添加现有文件,然后单击文件选择器中的“添加为链接”.  Add As Link 
(来源: free.fr

至于要放在共享文件中的内容,我建议放置将在程序集之间共享的内容。像版权,公司,也许版本的东西。

3
Cameron MacFarland

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

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

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

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

顺便说一句,如果你使用它,将AssemblyInfo.wcrev添加到你的版本控制和 ignore AssemblyInfo.cs

1
John Denniston

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

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

1
SaguiItay