You are on page 1of 3

科技广场 2005.8

.NET 应用程序的部署技术
Technology of Disposing .NET Program

蔡体健 谢 昕
Cai Tijian Xie xin
华东交通大学信息工程学院 南昌 330013
(School of Information Eng.,East China Jiaotong Uni., Nanchang 330013)

摘 要: 本文介绍了部署 NET 应用程序的一般方法 着重阐述了组件的路径设置 以及使用强名称为程序


集签名的应用
关键字: 部署; 强名称; 组件;  NET应用程序
中图分类号 TP392 文献标识码:A  文章编号 1671-4792-(2005)08-0035-03
Abstract the text introduce the ways to dispose  NET program, especially expatiate the
using about setting  the path of subassembly and using sn.exe to encrypt program set.
Keywords Dispose; Encrypt; Subassembly;  NET program

0 引言 或 Microsoft 系统管理服务器 (SMS) Visual Stu-
NET Framework 具有容易移植 跨平台 跨语 dio .NET  提供了安装与部署项目 通过这个项目
言集成等优点 在软件开发架构方面 NET Frame- 可以使用安装向导快速生成窗口应用程序或 W e b 应
w o r k 已成为软件开发的通用平台 所谓软件的 部 用程序的安装程序
署 就是将制作完成的组件或应用程序安装到其他 在非正式的情况下 有时只是希望简单的将应
计算机使用 由于 NET Framework 的功能全面 涉 用程序复制到其他计算机 那么会产生一些问题
及的方面较广泛 使得软件的开发部署过程显得比 例如 组件的设置 Web 应用程序虚拟目录的路径或
较复杂 本文正是作者在使用 C # 进行软件开发后 名称等不同 对于窗口应用程序 问题比较容易解
对部署. N E T 应用程序的一些心得体会 决 而对于 W e b 应用程序 将项目文件夹复制到指
1 NET 提供的安装和部署项目 定计算机后 还需要将项目文件夹设置成 Web 共享
由于安装应用程序的计算机与制作应用程序的 然后在项目文件夹内找到扩展名为. w e b i n f o 的文
计算机的设置不同 简单的将应用程序复制到其他 件 用记事本打开此文件 将文件中 Web URLPath
计算机的方法会出现许多问题 软件部署的最好方 的值改为项目文件夹的 W e b 共享名可解决问题
式就是将应用程序打包为通用的分发格式 如 .cab 2 组件的路径设置
或  . m s i   文件 许多应用程序都采用应用程序分 .NET  应用程序可以用多种方式部署 这取决于
发机制进行安装 如使用了 Microsoft Installer 应用程序的复杂程度 安全和保护要求 以及应用
技术的 Microsoft Windows 2000 IntelliMirror 程序的分发方式 基于组件的应用程序的部署比较

90

 万方数据
复杂一些 如果组件是对应用程序专用的 那么基 许多应用程序都使用由许多应用程序共享的组
于组件的应用程序的部署基本上可以按与简单应用 件 默认情况下 这些组件安装在系统中的公用位
程序相同的方式对待 但是组件若与相关或潜在的 置 -- 全局程序集缓存 (GAC)中 系统会在该位置查
应用程序共享 则需要注意应用程序所引用的组件 找每个程序的组件 我们可以使用 N E T   S D K 提供
的存放路径 一般情况下应用程序文件和组件文件 的 Gacutil.exe/i 工具 将组件添加到全局程序集
必须驻留在同一目录中 例如 Visual Studio .NET 缓存中
默认编译后应用程序和组件是在同一个目录下 但 多个应用程序共享单个组件常常会导致这样的
是组件文件能否不与应用程序文件存放在同一目录 情况 与一个应用程序一起安装的组件会改写现有
下呢 为此.NET Framework 需要建立单独的基于 的已安装组件 从而可能导致其他应用程序中断
X M L 的应用程序配置文件来支持位于其他目录中的 如何在多个应用程序之间互不干扰地共享组件呢
组 件 例 如 有 一 个 窗 口 应 用 程 序 解决办法是将组件程序集的不同内部版本号与客户
windowsApplication1.exe 它需要引用三个组件 端应用程序关联起来 这种内部版本号由版本号和
ClassLibrary1.dll ClassLibrary2.dll 一种特殊值 叫做发信方 的组合来表示 系统随
ClassLibrary3.dll 这三个组件集中存放在 后可以将这些组件程序集隔离 以便不同版本对于
ClassLibrary 文件夹下 如果应用程序要访问此文 不同的客户端应用程序可以同时运行 即应用程序
件夹下的组件 需要建立一个此应用程序的配置文 可以与同一应用程序的其他版本并行运行 而不影
件 windowsApplication1.exe.config 此配置文 响它们各自的执行环境
件与可执行文件驻留在同一目录中 它具有可执行 如何为组件添加内部版本号呢 在此首先阐述
文件的完整名称 并有一个额外的文件扩展名  . 一下发信方签名的工作原理 如图一所示
config 此配置文件是标准的 XML  文件 具体设
置如下
<configuration>
  <runtime>
  <assemblyBinding       xmlns="urn:schemas-
microsoft-com:asm.v1">
  <probing privatePath="ClassLibrary"/>
  </assemblyBinding>
  </runtime>
</configuration> 图一 为组件签名的工作原理图
当此配置文件与可执行文件放在同一目录中 若程序集 B 将引用程序集 A 为保证程序集 A 是
时 .NET  环境在运行时除了在应用程序的目录中查 未被篡改可信赖的组件 需要为程序集 A 添加签名
找组件外 还会在 privatePath  标记所确定的子 方法是
目录 ClassLibrary 中查找组件 特别需要注意的是 开发者首先使用强名称工具 (Sn.exe)  生成新
组件文件可以不与应用程序文件存放在同一文件夹 密钥对 私钥和公钥 然后开发环境或工具使用私
内 但它只能存放在应用程序文件夹下的子目录中 钥对程序集 A 进行签名 该数字签名存储在包含程
3 使用强名称为共享组件签名 序集 A 的清单的可移植可执行文件中 程序集 B 引

91

 万方数据
科技广场 2005.8

用程序集 A 时 程序集 B 清单的引用部分包括代表 snk")]


程序集 A 公钥的标记 标记是完整公钥的一部分 [assembly: AssemblyKeyName("")]
在将程序集 A 放在全局程序集缓存时公共语言运行 在此需要注意 IDE 查找密钥文件的位置 Visual
库将验证强名称签名 运行时 公共语言运行库会 Basic .NET 在包含 Visual Studio 解决方案的目
将存储在程序集 B 的清单中的公钥与程序集 A 的签 录下查找密钥文件 而 C#  编译器则在包含二进制
名进行比较 如果安全检查通过 则程序集 B 可保 文件的目录下查找密钥文件 因此在此例中
证程序集 A 的任何位未被篡改 这些位确实来自程 AssemblyKeyFile 属性设置为 "..\\..\\orgVerKey.
序集 A 的开发人员 snk"
用私钥对程序集 A 进行签名的方法有两种 在应用中 如果组件由于病毒 人为或非人为
使用 .NET Framework SDK 提供的程序集链接 的原因被篡改了任何一个位 则组件不能通过安全
器 (Al.exe)工具 检查 如果组件的版本不对 则也不能正确引用 运
在开发环境中设置程序集属性 AssemblyKeyFileAttribute 行后会出现程序集引用不匹配的错误提示
或 AssemblyKeyNameAttribute 将强名称信息插入 4 结束语
代码中 相比以往的 Web 应用程序 NET 的 Web 应用程
在此我们介绍在开发环境中给程序集签名的方 序的一大优势是它的安全部署功能 掌握 NET 应用
法 在 Visual Studio .NET 中 Windows  服务模板 程序的部署 将能充分发挥 N E T 的各项功能
已经为开发人员准备了一个 AssemblyInfo.cs 文件
开发人员只需按要求填写具体内容即可 例如如果 参考文献
组件版本号为 1 . 0 . 0 . 0 密钥文件为 o r g V e r K e y . [1]曹祖圣 吴明哲 林兆焱等编著. Visual
snk 则 AssemblyInfo.cs 文件的有关设置如下所 C # N E T 程序设计经典[ M ] . 科学出版社, 2 0 0 4 ( 1 ) ,
示 P556 ̄585.
[2]Microsoft .NET Framework SDK 文档.
//  修改程序集的版本信息 [3]MSDN Library  For Visual Studio.NET.
[assembly: AssemblyVersion("1.0.0.0")]
/ /   使用下面的属性控制用于签名的密钥 作者简介
[assembly: AssemblyDelaySign(false)] 蔡体健,女,讲师,1968 年出生,硕士
[assembly: AssemblyKeyFile("..\\..\\orgVerKey. 谢昕,男,副教授,1969 年出生,硕士

92

 万方数据

You might also like