http://sw.zhxs.org/showtopic-407.aspx
http://blog.csdn.net/shuilan0066/archive/2011/01/28/6168293.aspx
http://blog.csdn.net/jomuncher/archive/2007/09/03/1770117.aspx
http://www.weste.net/2007/10-8/20410312183.html
http://www.8844.com/html/IT_jiaocheng/ruanjian/biancheng/2010/09-
14/274673.html
² 所谓 项目依赖项
在生成解决方案时,可能需要首先生成某些项目,以便生成其他项目所使用的代码。当一个项目使用另一个项目生成的可执行代码时,生成代码的项目被称为使用该代码的项目的项目依赖项。此类依附性关系可以在“项目依赖项”对话框中定义
² 所谓 AddRemoveProgramesIcon
指定要在目标计算机的“添加/删除程序”对话框中显示的图标。此图标可以是图标文件 (.ico),也可以是作为资源包含在 .exe 或 .dll 文件中的图标。
AddRemoveProgramsIcon属性的设置如下所示:
此属性在“图标”对话框中设置。必须将包含该图标的文件添加到项目中,才能在“图标”对话框中使用该图标。
设置 说明
(无) 将在“添加/删除程序”对话框中显示一个默认图标。
(图标) 已选定一个图标,此图标将显示在“添加/删除程序”对话框中。
(浏览...) 显示“图标”对话框。
² 所谓 Author
指定应用程序或组件的作者姓名。
² 所谓 Description
为安装程序指定自由格式的说明。通常用来描述要安装的应用程序或组件。
在 Windows 资源管理器中选定某安装程序文件 (.msi) 后,Description 属性将显示在“属性”对话框的“摘要”页上。安装该应用程序后,此属性还显示在“支持信息”对话框中,可从“添加/删除程序”对话框访问“支持信息”对话框。
² 所谓 DetectNewerInstalledVersion
指定在目标计算机上安装时是否检查有无应用程序的更新版本。如果此属性设置为 True,并且在安装时检测到了更高的版本号,则结束安装。
设置 说明
True 安装程序将检查是否有更新版本;一经发现,将中止部署。
False 安装程序将不检查是否有更新版本。
² 所谓 Keywords
指定用于收缩安装程序的关键字。
² 所谓 Localization
指定字符串资源和运行时用户界面的区域设置。
² 所谓 Manufacturer
指定应用程序或组件制造商的名称。
² 所谓 ManufacturerUrl
指定包含有关应用程序或组件制造商信息的 Web 站点的 URL。ManufacturerUrl 属性的形式为:http://Address/OptionalAddress,其中 address 是您的 Web 站点的有效 URL,OptionalAddress 是特定页的可选路径。
ManufacturerUrl 属性显示在“支持信息”对话框中,可从“添加/删除程序”对话框访问“支持信息”对话框。
² 所谓 ProductCode
为应用程序指定唯一标识符,该标识符由字符串 GUID 表示。此标识符必须随版本和语言的不同而不同。
Windows 安装程序在后面的安装或升级过程中使用 ProductCode 标识应用程序;任何两个应用程序的 ProductCode 都不能相同。为确保 ProductCode 的唯一性,绝对不要手动编辑 GUID,而应该使用“产品代码”对话框中的 GUID 生成功能。
² 所谓 ProductName
指定在目标计算机上安装应用程序或组件时用于描述该应用程序或组件的公共名称。默认为部署项目的名称。
² 所谓 RemovePreviousVersions
指定安装程序在安装期间是否移除应用程序的早期版本。如果此属性设置为 True,并且在安装时检测到了早期版本,则将调用以前版本的卸载功能。
安装程序将检查 UpgradeCode 和 ProductCode 属性以确定是否应移除早期版本。新旧两种版本的 UpgradeCode 必须相同;ProductCode 必须不同。
RemovePreviousVersions 属性的设置如下所示:
设置 说明
False 安装程序将不检查是否有以前的版本。
True 安装程序将检查是否有以前的版本;一经发现,将予以卸载。
² 所谓 SearchPath
指定路径,在生成安装程序或合并模块时,使用该路径在开发计算机上搜索依赖的程序集、文件或合并模块。默认路径指向 Visual Studio 合并模块文件夹。可以编辑默认路径,并且可以为搜索操作添加多个路径。
此属性在“搜索路径”对话框中设置。
² 所谓 Subject
指定描述应用程序或组件的附加信息。
² 所谓 SupportPhone
指定在目标计算机上安装某应用程序或组件时用于该应用程序或组件的支持信息的电话号码。
SupportPhone 属性显示在“支持信息”对话框的“技术支持信息”字段中,可以从“添加/删除程序”对话框访问“支持信息”对话框。
² 所谓 SupportUrl
指定包含应用程序或组件支持信息的 Web 站点的 URL。SupportUrl 属性的形式为:http://Address/OptionalAddress,其中 address 是 Web 站点的有效 URL,OptionalAddress 是特定页的可选路径。
SupportUrl 属性显示在“支持信息”对话框的“技术支持信息”字段中,可以从“添加/删除程序”对话框访问“支持信息”对话框。
² 所谓 Title
指定安装程序的标题。默认情况下,Title 属性与部署项目的名称相同。
在 Windows 资源管理器中选定某安装程序文件 (.msi) 后,Title 属性将显示在“属性”对话框的“摘要”页上。
² 所谓 UpgradeCode
指定代表应用程序的多个版本的共享标识符,使用字符串 GUID 来表示。此属性供 Windows 安装程序用来在安装期间检查应用程序的已安装版本。
只应为第一个版本设置 UpgradeCode;决不要为应用程序的后续版本更改此属性,也不要为不同的语言版本更改它。更改此属性将导致 DetectNewerInstalledVersion 和 RemovePreviousVersions 属性无法正常工作。
此属性在“升级代码”对话框中设置。UpgradeCode 属性中包含的字母必须是大写形式。
² 所谓Version
指定安装程序、合并模块或 .cab 文件的版本号。
对安装程序、合并模块或 .cab 文件的每个已发布版本均应更改 Version 属性。当 Version 属性更改时,也应更新 ProductCode 属性。
------------------------------------------------------------------------------------------------------------------------------------------
一)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:V1V1.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,请注意处理