有没有办法减轻维护.NET程序集引用的痛苦?

时间:2009-03-26 18:03:42

标签: .net asp.net reflection assemblies metadata

我目前正在开发一个涉及多个程序集的Web项目,其结构如下:

WebProject
 |
 +--> A (external assembly, Version 1.0.0.0)
 |
 +--> B (external assembly, Version 1.0.0.0)

难点在于,为了跟踪已部署的内容,我想在每次构建时更新程序集A和B的版本号。现在我正在用[assembly: AssemblyVersion("1.0.*")]技术做到这一点,但它在WebProject项目中造成了严重破坏,因为它包含许多引用程序集A和B中类型的ASP.NET页面和母版页。

除手动之外,是否有更简单的方法来更新这些引用?

更新:程序集A& B住在一个解决方案中,而WebProject则存在于另一个解决方案中。另外,A& B的名称很强,因为它们已部署到IIS / SharePoint服务器。

5 个答案:

答案 0 :(得分:1)

您是直接引用已编译的程序集吗?考虑将它们添加到您的解决方案中,并将它们作为项目引用包含在内。

如果你做得对,这将适用于多个应用程序使用的程序集,因为每个“父”解决方案都可以包含引用。当然,这导致了不可避免的挑战,即知道“这种变化是否打破了任何其他应用程序”,这需要相当多的计划。通过对接口和/或抽象类进行编码并将签名中任何无法通过重载实现的任何更改视为“重大更改”,需要对使用这些程序集的其他应用程序进行回归,可以缓解此问题。

答案 1 :(得分:1)

在同一解决方案中使用项目引用,这是自动完成的。

如果A和B不在同一个解决方案中,那么您可以将对它们的引用设置为不需要特定版本(查看引用属性) - 但要注意这只是为了编译时间,所以你仍然会需要在A或B更新时重新编译Web项目。

如果没有,你可能会看到装配绑定重定向。

答案 2 :(得分:1)

在Cedaron的构建过程中,我们通过构建脚本将它们复制到Web项目的bin目录中来维护Web项目中的引用,而不是声明引用。

你不会认为这会奏效,但确实如此。如果它们位于bin目录中,则可以使用它们。

答案 3 :(得分:0)

原来我发现了一个博客,描述了使用TortoiseSVN附带的subwcrev工具来替换1.0.0。$ REV $和1.0.0.25等等。这几乎是我想要的。这是理智的。

答案 4 :(得分:0)

我使用powershell脚本来执行相同的操作,与使用SVN或任何特定版本控制系统无关。

# SetVersion.ps1
#
# Set the version in all the AssemblyInfo.cs or AssemblyInfo.vb files in any subdirectory.
#
# usage:  
#  from cmd.exe: 
#     powershell.exe SetVersion.ps1  2.8.3.0
# 
#  from powershell.exe prompt: 
#     .\SetVersion.ps1  2.8.3.0
#
# last saved Time-stamp: <2009-February-11 22:18:04>
#


function Usage
{
  echo "Usage: ";
  echo "  from cmd.exe: ";
  echo "     powershell.exe SetVersion.ps1  2.8.3.0";
  echo " ";
  echo "  from powershell.exe prompt: ";
  echo "     .\SetVersion.ps1  2.8.3.0";
  echo " ";
}


function Update-SourceVersion
{
  Param ([string]$Version)

  $NewVersion = 'AssemblyVersion("' + $Version + '")';
  $NewFileVersion = 'AssemblyFileVersion("' + $Version + '")';

  foreach ($o in $input) 
  {

    #### !! do Version control checkout here if necessary 
    Write-output $o.FullName
    $TmpFile = $o.FullName + ".tmp"

     get-content $o.FullName | 
        %{$_ -replace 'AssemblyVersion\("[0-9]+(\.([0-9]+|\*)){1,3}"\)', $NewVersion } |
        %{$_ -replace 'AssemblyFileVersion\("[0-9]+(\.([0-9]+|\*)){1,3}"\)', $NewFileVersion }  > $TmpFile

     move-item $TmpFile $o.FullName -force
  }
}


function Update-AllAssemblyInfoFiles ( $version )
{
  foreach ($file in "AssemblyInfo.cs", "AssemblyInfo.vb" ) 
  {
    get-childitem -recurse |? {$_.Name -eq $file} | Update-SourceVersion $version ;
  }
}


# validate arguments 
$r= [System.Text.RegularExpressions.Regex]::Match($args[0], "^[0-9]+(\.[0-9]+){1,3}$");

if ($r.Success)
{
  Update-AllAssemblyInfoFiles $args[0];
}
else
{
  echo " ";
  echo "Bad Input!"
  echo " ";
  Usage ;
}