使用程序集属性的最佳实践是什么?
-
09-06-2019 - |
题
我有一个包含多个项目的解决方案。我正在尝试通过链接一个解决方案范围的程序集信息文件来优化 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:
- 选择 添加/现有项目... 在项目的上下文菜单中
- 选择GlobalAssemblyInfo.cs
- 单击右侧的小向下箭头展开添加按钮
- 在按钮下拉列表中选择“添加为链接”
其他提示
就我而言,我们正在构建一个拥有 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 都会构建到每个程序集中。这为我们提供了两全其美的方案,您可能希望为所有项目提供一些通用属性,并为其他一些项目提供特定值。
希望有帮助。
@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”值。
MSBuild 社区任务 包含一个名为 AssemblyInfo 的自定义任务,您可以使用它来生成 assemblyinfo.cs。它需要对 csproj 文件进行一些手动编辑才能使用,但这是值得的。
在我看来,使用 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>
要在多个项目之间共享文件,您可以添加现有文件作为链接。
为此,请添加现有文件,然后单击文件选择器中的“添加为链接”。
(来源: 自由.fr)
至于要放入共享文件中的内容,我建议放入可在程序集之间共享的内容。比如版权、公司,也许还有版本。
不建议对多个项目使用单个 AseemblyInfo.cs 文件。AssemblyInfo 文件包含可能仅与该特定程序集相关的信息。两个最明显的信息是 AssemblyTitle
和 AssemblyVersion
.
更好的解决方案可能是使用 targets
文件,该文件由 MSBuild 处理,以便将程序集属性“注入”到多个项目。
我发现有用的一件事是通过在预构建阶段应用令牌替换来生成 AssemblyVersion 元素(等)。
我用的是TortoiseSvn,使用起来很方便 SubWCRev.exe
转动模板 AssemblyInfo.wcrev
进入 AssemblyInfo.cs
. 。模板中的相关行可能如下所示:
[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]
第三个元素是修订号。我使用第四个元素来检查我没有忘记提交任何新的或更改的文件(如果一切正常,第四个元素是 00)。
顺便补充一下 AssemblyInfo.wcrev
到你的版本控制和 忽略 AssemblyInfo.cs
如果你用这个。