浅谈.NET中的版本管理

转载 2011年01月16日 22:04: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三层开发

首先,谈谈学习上的问题,学习Web开发就是一个积累的过程,循序渐进,一步一步来切不可急于求成,那样写出来的网站会漏洞百出的,对此我总结了以下几点;           1.常做总结          ...
  • cclg0918
  • cclg0918
  • 2015年05月22日 19:00
  • 305

浅谈管理与管理者的自我修养

今天和大家分享的是一篇管理学的知识,也是我多年当项目经理总结的经验。       我们开发人员在一定的年纪之后肯定会转型不能一辈子的敲代码,而转管理的人有很多但是真正会管理的却很少,但是大家都总结为...
  • qq_39218478
  • qq_39218478
  • 2017年07月11日 11:59
  • 178

《管理的常识》第四章<什么是领导>读书笔记

一、领导的理解        领导就是指影响别人,以达到群体目标的过程。        领导特性:作为管理职能,领导借助于影响力发挥作用而非职位。        影响力=权力+魅力        1、...
  • charleslei
  • charleslei
  • 2015年04月06日 19:05
  • 690

01. C#和.net框架介绍

C#编程语言是为开发微软公司的 .Net框架上的程序而
  • manofstyle1
  • manofstyle1
  • 2014年09月07日 22:05
  • 513

VS中修改.net版本

更换.net版本,重新build。 网站项目分为 website 和 web application project 两种开发模式 1)若为website 项目名右键Property pages,...
  • jl1134069094
  • jl1134069094
  • 2016年04月14日 14:38
  • 2890

查看电脑安装的.net版本

其实很简单,但是中文搜索的内容比较啰嗦,七嘴八舌,不是官方。 下面是官方的检查办法: https://msdn.microsoft.com/en-us/library/hh925568(v=vs....
  • hailanzhijia
  • hailanzhijia
  • 2015年05月14日 17:28
  • 1451

.Net Framework各个版本区别

什么是.NET Framework?   .NET Framework又称 .Net框架。是由微软开发,一个致力于敏捷软件开发(Agile software development)、快速应用开发(...
  • tiana0
  • tiana0
  • 2013年09月15日 09:35
  • 4359

ASP.NET之旅--浅谈Asp.net运行机制(一)

很多Asp.net开发人员都有过Asp的背景,以至于我们开发程序的时候总是停留在“页面”层次思考,也就是说我们常常会只考虑我们现在所做的系统是要完成什么功能,是要做问卷调查网站还是个人网站,而很少在“...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2013年09月02日 07:56
  • 11032

查看.Net Framework的版本(PC和WinCE)

http://blog.csdn.net/esunshine1985/article/details/9060953 一、在电脑上查看.Net Framework的版本 (1)第一步:...
  • mituan1234567
  • mituan1234567
  • 2013年11月27日 09:44
  • 848

搞懂.NET Framework 历史版本(2017年)

最近被.NET平台各种名词、以及各种版本弄得有些疑惑,开发和部署,对于开发平台版本选择是个基本问题,因此,花了些时间,学习汇总了有关.NET版本演进的历史。 .NET简介 这个平台相信我们都知道...
  • MePlusPlus
  • MePlusPlus
  • 2017年08月02日 22:20
  • 1112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈.NET中的版本管理
举报原因:
原因补充:

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