更新.NET项目引用(在配置文件中)

4
我有一个解决方案,包括多个项目,其中包括:

Foo.Bar.Client
Foo.Common

Foo.Bar.Client 依赖于 Foo.Common 中的组件。而且,Foo.Common 没有自己的配置文件;它的设置存储在使用它的客户端应用程序的配置文件中,即 Foo.Bar.Client
因此,Foo.Bar.Client 的配置文件包含

  <configSections>
    <section name="BletchConfiguration" 
             type="Foo.Common.Bletch, Version=1.1.0.0, ..."/>
    ....
  </configSections>

我被委托调整我们的版本编号,使“修订”部分对应于最新的更改集(在我们的情况下,使用Subversion,即HEAD修订号),例如从“1.1.0.0”到“1.1.0.12345”。
因此,我按照这里描述的方式实现了一个“共享”的程序集版本信息模块。并修改了我们的NAnt构建脚本以获取版本号并更新共享的程序集信息文件。
然而,我没有考虑到版本号嵌入到配置文件中的情况。是否有一种(相对)轻松的方法自动更新配置文件中的版本号?
显然,我可以将“公共”程序集拆分为单独的解决方案。
我还可以使用IoC配置公共组件,这将消除程序集特定配置部分的需要。
但是,这两种方法都涉及一些风险和时间...这两者都希望尽可能避免(至少目前是这样)。
2个回答

2
快速回答 - 除非您的应用程序支持同时运行多个版本的 Foo.Common.dll,否则我会在配置部分中省略版本号。
<configSections>
    <section name="BletchConfiguration" 
         type="Foo.Common.Bletch, Foo.Common"/>
    ....
</configSections>

这不仅适用于配置文件结构中的“section”区域 - 这是 .net 的固有特性,也是一种广泛使用的约定。

[编辑]

我找不到任何具体涉及哪些部分是可选的文档。MSDN 文档只说明了结构 http://msdn.microsoft.com/en-us/library/ms228245.aspx 但是,根据记忆和一些实验...(它非常灵活 - 方括号表示可选项)

如果您的 DLL 在 GAC 中 - 您将需要 Version... FullTypeAndNamespace、AssemblyNameWithoutExtension、Version、Culture、PublicKeyToken [,PlatformType]

如果您的 DLL 在 bin 目录中 FullTypeAndNamespace、AssemblyNameWithoutExtension [,Version、Culture、PublicKeyToken] [,PlatformType]

因此,前两个部分是必需的,因为应用程序需要知道在哪个程序集中查找您指定的类型。

您可以以任何顺序使用可选组件(因为它们被结构化为键=值对,顺序无关紧要)。只需指定要约束的元素,省略其余内容。

因此,在我给出的示例中,CLR 将加载与名称匹配且包含所需类型的第一个 DLL。


你能给我指一些文档吗?我一直在思考(和搜索)这些方面,但我没有找到任何可以表明哪些部分的“type”可以省略以及何时省略的内容。 - David

1

我不会经常更改我的 AssemblyVersion。你应该为每个构建版本更新 AssemblyFileVersion(这样你就可以区分它们),但是每次构建都更改 AssemblyVersion 会带来很多问题。

AssemblyVersion、AssemblyFileVersion 和 AssemblyInformationalVersion 有什么区别?

编辑:当我确实需要更新 AssemblyVersion 时,我运行一个 PowerShell 脚本来查找需要修改的文件,检查它们并进行更改。在验证一部分文件后,我手动提交更改。

以下是更新实际 AssemblyVersion 的脚本:

get-childitem . -rec -include AssemblyInfo.cs | select-string "assembly: AssemblyVersion(" -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "assembly: AssemblyVersion\(`"\d\.\d\.\d\.\d", "assembly: AssemblyVersion(`"2.0.0.0" } | set-content $_.Path -Encoding UTF8 }

以下是一种将项目引用从1.5.0.0升级到2.0.0.0的方法:

get-childitem . -rec -include *.csproj | select-string "<Reference Include=`"Acme.SomeProduct," -simplematch -list | % { & p4 sync $_.path; & p4 edit $_.path; (get-content $_.Path) |% { $_ -replace "<Reference Include=`"Acme\.SomeProduct, Version=1\.5\.0\.0,", "<Reference Include=`"Acme.SomeProduct, Version=2.0.0.0," } | set-content $_.Path -Encoding UTF8 } 

我也同意这个观点。我们每次构建时都会更新文件版本,只有在发布时才更改程序集标识。但是,无论您多频繁地更改它,如果您在配置中使用版本号,它可能会在某些时候让您感到困惑。Suzanne Cooke建议您在开始发布之前更改程序集版本(http://blogs.msdn.com/b/suzcook/archive/2003/05/29/when-to-change-file-assembly-versions.aspx),而不仅仅是在发布之前 - 有很好的理由 - 更改程序集标识会影响应用程序的行为。 - Adam
这很有道理。不幸的是,一些.config引用被传递给一个(较旧的)企业库块,该块_需要_四部分组成的程序集版本号,即major.minor.build.revision。 - David
@Russell - 感谢您的回复...我很难选择一个要“接受”的答案。我对您的PowerShell技能感到敬畏。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接