`

浅析.Net共享程序集编程

阅读更多
作者:宋华   赛迪网
Net结构里的程序集Assembly是自我描述的安装单元,它在应用程序域(AppDomain)中运行。您必须首先将程序集加载到应用程序域中,然后才能运行该应用程序,并且,同一程序集可以加载到多个应用程序域中,根据这些应用程序域对该程序集代码使用方式的不同产生了程序集的分类:私有程序集和共享程序集。

1、私有程序集

我们通常用到的就是私有程序集。这种情况下,我们创建本地应用程序项目(或组件),编译后就生成dll或exe类型的私有程序程序集。当我们在其他客户应用程序中使用这类程序集时,只需要添加引用。当这样的程序集被多个应用程序域使用时,每个应用程序域需要复制该程序集,进程中也将存在该程序集的多个副本。

2、共享程序集

与私有程序集相对的是共享程序集(Shared Assembly),它提供多个应用程序域访问同一个程序集的能力,特别地,内存中只存在该程序集的同一份副本,这种非特定于域的代码共享极大节省了内存资源占用。并且,在大多数情况下,共享程序集安装在全局程序集高速缓冲存储器(Global Assembly Cache)中而不存在于应用程序相关目录下,对它的引用不会产生文件复制,自然也不会产生额外的副本。因而,共享程序集不能简单通过XCOPY命令实现部署,而应使用MSI(Microsoft Windows Installer)进行。当组件和主应用程序不由同一个开发商建立,或者一个大应用程序分布在几个小工程中时,常常需要使用共享程序集。

创建名称唯一的共享程序集

与私有程序集不同,使用共享程序集时要遵循许多规则。特别地,共享程序集必须有一个唯一的名称(称为强名StrongName)。这个名称被要求必须是全局唯一的,并且应该能够保护该名称,其他人不能再使用它创建同名程序集。一般地,我们通过嵌套命名空间层次结构来满足这一要求。结合公司名称、项目类别(类似文件夹分类)等命名项目类等对象,可以在一定程度上避免程序集重名。而配合使用公共/私有密钥机制,则可以彻底保证名称的唯一性。(关于密钥机制请参见专门的文章),下面简要说明强名称工具Sn.exe在这方面的应用:

生成公共/私有密钥对文件

.Net结构中的强名称工具Sn.exe有助于使用强名称对程序集进行签名,而通过签名具有强名称的程序集,就可以确保名称的全局唯一性。Sn.exe工具提供用于密钥管理、签名生成和签名验证的选项。其重要的一个应用是生成一个新的密钥对并将其写入指定的文件。引用这个密钥对文件的共享程序集将能够保证唯一的名称。

下面的命令行语句创建一个新的随机密钥对并将其存储在 myKey.snk 文件中。

sn -k myKey.snk

(Sn.exe还有很多参数,请参见Microsoft技术支持)

修改属性为程序集应用强名称

下一步,使用程序集属性将强名称信息引入代码中。属性AssemblyKeyFileAttribute指定包含用于生成共享名称的密钥对的文件名称,这个属性位于AssemblyInfo.cs文件中,该文件在使用Visual Studio.Net SDK创建项目时自动生成,用于保存程序集配置等信息。

在代码模块中,添加AssemblyKeyFileAttribute属性的同时指定在使用强名称为程序集签名时要用到的密钥对文件的名称及路径。下面的代码示例当前程序集与名为myKey.snk 的密钥文件一起使用:

[assembly:AssemblyKeyFileAttribute(@"..\myKey.snk")](修改mykey.snk文件为正确的路径),这之后,如果使用Idasm工具查看该程序集,其清单中将包含一个公共密钥(私有密钥将不会保存在程序集清单中,这可以确保程序集不被非法修改)。

在全局程序集高速缓冲存储器GAC(Global Assembly Cache)中安装共享程序集

在我们使用Dll类型的私有程序集时,需要添加该程序集引用。而当私有程序集是exe类型时,还需要将它显式复制到当前应用程序的可执行目录(通常是当前工程的\Bin\Debug目录)中。其实,对DLL类型私有程序集的引用实质上也隐式进行了复制。添加应用后,在当前应用程序可执行目录或其子目录下,你就能够找到被引用的程序集文件(其实正是因为这样的特性,私有程序集安装很简单,只需复制改程序集中的所有文件,一个xcopy命令就足够了,这就是0压缩安装)。

与此类似,使用共享程序集也需要添加引用。不同的是,引用共享程序集不产生复制,而是在使用共享程序集前将其安装到全局程序集高速缓冲存储器GAC(Global Assembly Cache)中。.Net提供的命令行工具gacutil.exe用于支持这一功能。gacutil.exe可以将具有强名称的程序集添至全局程序集缓存。命令格式为:

<ccid_nobr>
<ccid_code>gacutil -I <程序集名称></ccid_code>
</ccid_nobr>

其中,"程序集名称"是要在全局程序集缓存中安装的程序集的名称。

下面的示例语句将文件名为 myAssembly.dll 的程序集安装到全局程序集缓存:

<ccid_nobr>
<ccid_code>gacutil -i myAssembly.dll</ccid_code>
</ccid_nobr>

在客户应用程序中使用共享程序集

在客户应用程序中使用共享程序集的方法与私有程序集一样简单。创建客户应用程序后,以与引用私有程序集相同的方式引用共享程序集,在应用程序代码中包含共享程序集命名空间(using语句),这之后,你就可以象使用本地对象一样使用共享程序集的公共对象了。

综合上述,在.Net中使用VS.NET SDK进行共享程序集编程可分为以下步骤:

1)、生成共享程序集代码文件(组件、类库等)

2)、创建密钥文件并签名共享程序集

3)、在GAC中安装共享程序集

4)、在客户应用程序中使用共享程序集

下面的例子详细说明以上过程。为节省篇幅,示例使用控制台应用程序。Windows Forms应用程序中共享程序集编程与此类似。

1)、生成共享程序集代码文件

这里,创建一个的Windows Class Library 类库工程TestCreateSharedAssembly,它提供方法GetCreateDateTime()以返回文件的创建日期、时间信息。

<ccid_nobr>
<ccid_code>public string GetCreateDateTime()
{
	DateTime dt=new DateTime();
	return dt.ToLongDateString();
}</ccid_code>
</ccid_nobr>

2)、创建密钥文件并签名共享程序集

首先,使用Sn.exe强名工具生成密钥对文件myKey.snk:

<ccid_nobr>
<ccid_code>Sn.exe -k myKey.snk;</ccid_code>
</ccid_nobr>

然后,修改AssemblyInfo.cs文件以签名当前程序集:

<ccid_nobr>
<ccid_code>[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"d:\winapp\myKey.snk")](请指定myKey.snk文件的正确路径)
[assembly: AssemblyKeyName("")]</ccid_code>
</ccid_nobr>

这之后,编译项目就将生成共享程序集TestCreateSharedAssembly.dll。

3)、在GAC中安装共享程序集

在程序集中包含了密钥对文件后,就可以使用全局程序集高速缓冲存储器gacutil的/I选项把它安装到全局程序集库(Global Assembly Store)中,下面的语句将前一步创建的共享程序集TestCreateSharedAssembly.dll安装到GAC中:

gacutil /I TestCreateSharedAssembly.dll

4)、在客户应用程序中使用共享程序集

现在,创建一个Windows Console控制台应用程序TestUseSharedAssembly。首先,引用前面创建的共享程序集TestCreateSharedAssembly.dll,这可以使用VS.Net主菜单(工程|添加引用)或集成解决方案Solution Explorer来完成,在点击它们的"浏览"按钮后的对话框中指定程序集TestCreateSharedAssembly.dll的正确路径完成引用。

在当前应用程序代码文件中,使用using语句包含欲使用共享程序集所在的命名空间TestCreateSharedAssembly,然后就可以象使用本地方法一样使用共享程序集的GetCreateTime()对象(包括属性、方法等)了。主要代码如下:

<ccid_nobr>
<ccid_code>using System;
using TestCreateSharedAssembly;//引用共享程序集名称空间
namespace TestUseSharedAssembly
{
class Class1
{
static void Main(string[] args)
{		
TestCreateSharedAssembly.Class1 tcsa=new TestCreateSharedAssembly.Class1();//实例化
string 
datetime=tcsa.GetCreateDateTime();//调用所应用程序集的公共方法Console.WriteLine("Shared 
Assembly Create Time is:"+datetime);
}
}
}</ccid_code>
</ccid_nobr>

编译当前工程并在命令行中运行它,就会显示所引用共享程序集的创建日期和时间信息:

<ccid_nobr>
<ccid_code>Shared Assemby Create Time is:2002年12月10日</ccid_code>
分享到:
评论

相关推荐

    浅析.Net下Active Directory编程技术

    ### 浅析 .Net 下 Active Directory 编程技术 随着信息技术的发展与互联网的普及,我们对计算机目录及其相关技术越来越熟悉。例如,我们日常使用的文件系统目录、专用工具集目录以及网络资源目录等,都是这类目录的...

    浅析.Net下的多线程编程

    本文介绍了在.Net下进行多线程编程所需要掌握的一些基本知识。从文章中我们可以知道在.Net下进行多线程编程相对以前是有了大大的简化,但是其功能并没有被削弱。使用以上的一些基本知识,读者就可以试着编写.Net下的...

    浅析.Net下的多线程编程[文].pdf

    在讨论.NET环境下的多线程编程时,我们首先需要了解.NET框架的线程模型,它是基于操作系统的线程模型构建的。.NET框架提供了System.Threading命名空间,其中包含用于创建和管理线程的类和接口,以及同步多个线程之间...

    浅析.NET下防止SQL注入式攻击的方法.pdf

    浅析.NET下防止SQL注入式攻击的方法.pdf

    浅析.NET下XML数据访问新机制

    .NET框架提供了多种XML数据访问机制,以适应不同场景的需求,从而优化开发效率和应用程序性能。 1. **ADO.NET中的数据集XML数据访问机制** ADO.NET是微软.NET框架中用于数据访问的核心组件,是ADO的升级版。它提供...

    深入浅析.NET应用程序SQL注入

    《深入浅析.NET应用程序SQL注入》 SQL注入是一种常见的网络安全威胁,主要针对使用不安全的SQL语句构建的Web应用程序。在.NET环境中,如果应用程序没有正确处理用户输入的数据,就可能导致SQL注入攻击。本文将通过...

    VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析

    在本节“VS2010轻松学习C# - 从零到深入 - 天轰穿.NET4趣味编程视频教程_第25讲:委托与事件实例浅析”中,我们将深入探讨C#编程中的两个核心概念:委托(Delegates)和事件(Events)。这两个概念在.NET框架中扮演...

    提高ASP.NET应用程序性能方法浅析

    ASP.NET是一种由微软开发的服务器端编程模型,用于构建高性能、可伸缩的Web应用程序。在本文中,我们将深入探讨如何提升ASP.NET应用程序的性能,从而优化用户体验并降低服务器资源的消耗。 首先,理解性能度量标准...

    浅析ASP.NET程序设计课程教学改革.pdf

    ASP.NET程序设计课程教学改革是针对当前教育模式中存在的一些问题进行的改进措施。该课程在计算机科学教育中占有重要地位,因为它融合了多种技术,如计算机技术、软件技术、网络技术和数据库技术。然而,传统的教学...

    【ASP.NET编程知识】浅析ASP.NET万能JSON解析器.docx

    ASP.NET是一种基于.NET Framework的服务器端编程环境,用于构建动态网站、Web应用程序和Web服务。在ASP.NET中,处理JSON(JavaScript Object Notation)数据是非常常见的任务,因为JSON是一种轻量级的数据交换格式,...

    浅析asp.net页面跳转

    浅析 ASP.NET 页面跳转 ASP.NET 页面跳转是一种常见的Web开发技术,涉及到页面间数据传递的方法。本文将讨论 ASP.NET 页面跳转的五种方法,分别是使用 Querystring 方法、隐藏域、ViewState、Cookie 和 Application...

    浅析VB.Net语言 复制、删除文件案例

    VB.NET语言经过长时间的发展,很多用户都很了解VB.NET语言了,这里我发表一个关于VB.Net语言 复制、删除文件的例子,和大家一起分享一下。

    浅析.net策略模式

    ### 浅析.NET策略模式 #### 一、策略模式简介 策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。此模式允许在运行时动态地选择算法或策略,从而实现对不同策略的选择与封装。在.NET环境中,策略模式...

    VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第27讲:ADO.NET实例浅析

    在本节"VS2010轻松学习C#-从零到深入-天轰穿.NET4趣味编程视频教程_第27讲:ADO.NET实例浅析"中,天轰穿老师将带领我们深入理解ADO.NET,并通过实例演示如何在实际项目中应用这一强大的数据访问技术。ADO.NET是.NET ...

    浅析.NET逻辑分层架构

    .NET逻辑分层架构是一种常见的软件架构设计模式,它通过将系统划分成若干层次来实现代码的组织和模块化。这种架构模式的主要优点是可以...通过理解和运用这些知识点,开发者可以更有效地设计和实现复杂的.NET应用程序。

    【ASP.NET编程知识】ASP.net处理XML数据实例浅析.docx

    "ASP.NET编程知识:ASP.net处理XML数据实例浅析" 本文将对 ASP.NET 处理 XML 数据的方法进行详细的讲解和分析。XML 是一种可扩展的标记语言,具有很大的灵活性,它的主要作用是作为一种数据存储或者数据传输的工具...

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate...多线程为基于.NET的应用程序实现响应迅速的用户.txt 浅述WinForm多线程编程与Control.Invoke的应用.txt 微软.Net开发中的多线程编程总结.txt 线程中的参数传递.txt

    ASP.NET深入浅析

    本文将深入浅析ASP.NET的核心概念和技术,帮助初学者掌握这一强大的开发平台。 1. **基础概念** - **Web Forms**: ASP.NET Web Forms提供了一种通过拖放控件来构建网页的方式,类似于传统的Windows编程模型。 - *...

Global site tag (gtag.js) - Google Analytics