浅谈.NET中的版本管理

原创 2004年10月14日 15:48:00

 

摘要:

随着社会的发展,人们对于科技应用到各个领域有新的认识,同时,这就使我们技术人员对于开发平台也有更高的要求。大家都知道,或者都听过,.NET有很强悍的版本控制,可以让我们很轻松的进行程序集的版本控制,实现程序的灵活配置和简单升级,告别Dll地狱,本文将用一个具体的实例说明如何使用这个功能。


概念:

(一)DotNet中的版本组成

DotNet中的版本由4个物理号码组成,如图(一)

图(一)

在程序集里面,我们可以通过加上AssemblyVersion特性来设置它,

[assembly: AssemblyVersion("2.0.2.11")]

(二) GAC:

计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享。在全局程序集缓存中部署的应用程序必须具有强名称,一个程序集如果注册到了GAC里,被其他程序集合引用的时候,将不会拷贝副本到引用的程序目录中。 (本文只讨论注册到GAC中的程序集)


正文:

(1) 我们现在开始写第一个组件

它的版本号为 1.0.0.0 有一个类,包含一个简单的方法,该方法返回一个字符串

代码如下,我都做了注解

//首先生成强名称到文件中
sn –k c:/Version.snk
//写类文件
v1.cs
using System;
using System.Reflection;
[assembly: AssemblyKeyFile(@"c:/Version.snk")]  //因为注册到GAC,所以使用强名称签名
[assembly: AssemblyVersion("1.0.0.0")]   //设置版本号 
namespace V1
{
          public class V1
          {
                    public V1()
                    {
                    }
                    public string GetVersion()
                    {
                    return "你好,我是版本1";
                    }
          }
}

编译成组件 V1.dll

拷贝这个V1.dll到 文件夹c:/V1

V1.dll注册到GAC

Gacutil –I c:/V1/V1.dll

系统显示注册成功

(2) 然后我们编写一个控制台程序测试这个组件

TestVersion.cs
///
///请添加对V1.dll(c:/V1/V1.dll)的引用,因为是在Gac里面,所以V1.dll不会在本地目录存在
///
using System;
namespace TestVersion
{
          
          class TestVersion
          {
                               static void Main(string[] args)
                    {
                               V1.V1 v1=new V1.V1();
                               Console.WriteLine(v1.GetVersion());
                               Console.Read();
                    }
          }
}

编译后运行(TestVersion.exe)

屏幕输出的结果是 :

"你好,我是版本1"

(3) 好了,一切很美好,过了几年了,我们得升级程序了

现在来编写V1.dll升级版本,版本号为2.0.0.0

 v1.cs
using System;
using System.Reflection;
[assembly: AssemblyKeyFile(@"c:/Version.snk")] ///使用上面的强名称
[assembly: AssemblyVersion("2.0.0.0")] ///注意,这里已经改了主版本号
namespace V1
{
          public class V1
          {
                    public V1()
                    {
                               
                    }
                    public string GetVersion()
                    {
                    return "你好,我是版本2";///修改了输出的结果,这样我们才知道到底是运行了那个
                    }
          }
}

编译 成组件 V1.dll

拷贝这个V1.dll到 文件夹c:/V2

V1.dll注册到GAC

Gacutil –I c:/V2/V1.dll

(4) .现在来看看再次运行TestVersion.exe输出了什么东西

是的,和原来的没有变化还是

"你好,我是版本1"

为什么不是"你好,我是版本2"?

我们用ildasm.exe打开程序集TestVersion.exe 看看

是的,它目前就是使用了版本1.0.0.0

(5) 我们开始进行版本升级

TestVersion.exe使用的版本由1.0.0.0替换成版本2.0.0.0

其实很简单的,给我们的 TestVersion.exe

加个配置文件 TestVersion.exe.config里面打入

<?xml version="1.0"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="V1" publicKeyToken=" 758fe4e9db9d8251"/>
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

简单说明:

assemblyIdentity 主要进行程序集合的标识

其中 name是程序集的名称 publicKeyToken是公匙的标记;如何获得这些信息呢?很简单,打开%SystemDir%/assembly (我的是C:/WINNT/assembly)

可以看到这些信息(如下图,你的机器上可能和我不一样)

可以看到有两个V1(正确,我们确实注册了两个进去,版本也对) 我们开始用的是1.0.0.0的,记下公匙Token 写到publicKeyToken

bindingRedirect 节点主要配置版本如何跳转

oldVersion="1.0.0.0" newVersion="2.0.0.0" 很清楚的,就是如果TestVersion.exe使用的V1.dll是旧版本的,程序集版本号为1.0.0.0,那么就使用新的,版本号为2.0.0.0的程序集

需要注意的是,oldVersion 可以使用范围来界定,如 oldVersion="1.0-1.9" 但是如果没有使用范围表示法的话,一定要写全版本号

newVersion 不可以使用范围表示法,请写全版本号

好了,现在再次运行TestVersion.exe

输出的是: "你好,我是版本2",掌声!!!

就是怎么简单!

(6) 如果现在我们用ildasm.exe打开程序集TestVersion.exe,看到的内容将没有变化

确实,是配置文件起了作用,整个过程没有对调用程序TestVersion.exe的代码做半点改动!

(7) 配置错了会怎么样?:

有可能的错误,比如newVersion写错了,根本没这个升级版本,将会抛出异常System.IO.FileNotFoundException,请注意处理


附注:

其实我们可以用控制面板中的Microsoft .NET Framework Configuration来配置版本管理,使用起来更简单,篇幅关系,需要可以联系我索取使用方法(bcatcat@hotmail.com)


总结:

可以看到,.NET为我们提供的版本控制是强大的而简单的,通过简单的配置就可以达到目的,希望本文能起到抛砖引玉的作用

 

 

 

 

.net DLL版本管理

每个DLL打上版本号,方便识别维护
  • yangmgrxc
  • yangmgrxc
  • 2015年09月11日 16:10
  • 130

配置管理与版本管理的思考

最近结合公司内部版本管理的实践碰到的问题总结一下自己的思路。配置管理的一个目的是保证过程的可重复。一个有效的配置管理可以将开发过程回溯到指定时刻。开发过程的不确定性决定这是很重要的功能。同时也可以保存...
  • woodhorse007
  • woodhorse007
  • 2006年05月11日 09:59
  • 1700

vs.net web项目使用visual source safe进行源代码管理

这段时间在公司做一个.net项目, 一个项目开发小组3个人,开发环境是vs.net,语言是c#,三个人协同开发。既然是协同开发,就要找一个源代码控制软件来进行开发中的源代码管理和版本控制。我们首先想到...
  • chnking
  • chnking
  • 2003年08月20日 11:00
  • 11062

.net web 架构浅谈

让我们先看看经典的三层架构 ,然后讲讲各个层次的用处和特点一般web应用程序包含下列层次WebUI|WinUI|WebService:界面和webservice Business Facade:业务层...
  • yizhu2000
  • yizhu2000
  • 2007年06月28日 16:55
  • 1294

浅谈人工智能

历史      各个文明中都有杰出的工匠发明了自动机器来代替人类劳动,早在春秋时期鲁班就发明了世界上第一个机器人,可在空中飞翔‘三日不下’;三国时期蜀汉的诸葛亮发明了‘木牛流马’来运送战备物资,称得上...
  • oba_gaga
  • oba_gaga
  • 2016年10月09日 20:57
  • 4220

软件研发管理之版本管理

版本管理是软件研发管理中比较容易忽视的一环,这当然是比较好理解的,因为版本管理毕竟和具体业务关系不大。其实,版本管理是很多更高级管理制度的基础,如果版本管理做得糟糕,类似代码审查一类的工作就很难高效方...
  • heliang1108
  • heliang1108
  • 2014年01月21日 19:11
  • 6001

ArcGIS Engine开发的ArcGIS 版本管理的功能

这是以前的ArcGIS Engine开发成果,主要是Geodatabase方面的,模仿ArcGIS版本的流程系统环境:VS2010、ArcGIS Engine10、DevExpress721(第三方控...
  • linghe301
  • linghe301
  • 2012年09月11日 10:10
  • 8055

Maven学习(十八)-- Maven最佳实践:版本管理

找到了一篇博客,很多啊,是讲Maven中的版本管理的,很好,分享一下, 原文作者:juvenshun 原文地址:http://juvenshun.iteye.com/blog/...
  • m261030956
  • m261030956
  • 2015年06月13日 12:57
  • 646

为什么要使用版本管理

为什么要使用版本管理? 1.作为数据备份,这是一个主要的原因了。虽然数据备份同样可以用比较笨的方法:本地复制副本,但这种古老的方法有很多不足,无法应对频繁的修改,会照成版本混乱,不便于管理,并且占用...
  • CFJ68583589
  • CFJ68583589
  • 2013年01月20日 23:20
  • 778

浅谈MVP架构及开发模式

Model-View-Presenter(MVP)概述     MVC模式已经出现了几十年了,在GUI领域已经得到了广泛的应用,由于微软ASP.NET MVC Framework的出现,致使MVC一...
  • ruglcc
  • ruglcc
  • 2016年01月15日 09:07
  • 3168
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈.NET中的版本管理
举报原因:
原因补充:

(最多只允许输入30个字)