.net程序集

转载 2007年09月15日 13:03:00
私有程序集

我们通常用到的就是私有程序集。这种情况下,我们创建本地应用程序项目(或组件),编译后就生成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可以将具有强名称的程序集添至全局程序集缓存。命令格式为:

gacutil -I <程序集名称>

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

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

gacutil -i myAssembly.dll

 

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

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

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

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

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

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

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

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

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

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

public string GetCreateDateTime()
{
	DateTime dt=new DateTime();
	return dt.ToLongDateString();
}

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

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

Sn.exe -k myKey.snk;

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

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

这之后,编译项目就将生成共享程序集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()对象(包括属性、方法等)了。主要代码如下:

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);
}
}
}

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

Shared Assemby Create Time is:2002年12月10日

 

相关文章推荐

.net程序集强名称签名实践

强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该...

转:.NET中的安全性之数字签名、数字证书、强签名程序集、反编译

本文将探讨数字签名、数字证书、强签名程序集、反编译等以及它们在.NET中的运用(一些概念并不局限于.NET在其它技术、平台中也存在)。1.数字签名数字签名又称为公钥数字签名,或者电子签章等,它借助公钥...

Asp.Net 显示程序集版本号

Asp.Net入门基础:如何显示程序集版本号 于很多有趣的原因,ASP.NET程序中虽然可以往App_code目录中追加AssemblyInfo.cs文件,但位于该文件中的版本号总是无法正确的显...

VC 调用托管程序集(.Net Managed Assemblies)

前言 .Net 类库功能非常全面分装了大量应用级别的API,所以有时会有在VC 中调用托管程序集(.Net Managed Assemblies) 的需求。本文通过示例对该步骤进行说明,并提供一些参...

VS.Net中程序集的Debug版本和Release版本的区别

Visual Studio 项目对程序的发布和调试版本分别有单独的配置。顾名思义,生成调试版本的目的是用于调试,而生成发布版本的目的是用于版本的最终分发。    如果在 Visual Studio ...
  • jjkliu
  • jjkliu
  • 2014-04-09 11:30
  • 1311

.NET 解释术语:CLR、FCL、IL、Assembly(程序集)

CLR常用简写词语,CLR是公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必...

什么是.NET的程序集

程序集是 .NET 框架应用程序的主要构造块。它是一个功能集合,并以单个实现单元(一个或多个文件)的形式生成、版本化和部署。所有托管类型和资源或者只在其实现单元中标记为可访问,或者在该单元外由代码标记...

.NET 程序集

.NET 程序集一、程序集的功能1、程序集包含公共语言运行库执行的代码(如果可移植可执行PE文件没有管理程序集清单,则将不执行该文件中的MSIL代码。每个程序集只能有一个入口,即DllMain、Win...

强命名程序集 sn.exe GAC(转http://blog.csdn.net/chenfeiyang2009/article/details/6055199)

2010-12-04 19:51 204人阅读 评论(0) 收藏 举报 GAC 强名的作用是识别篡改、防止dll冲突。   GAC中的所有的Assembly都会存放在系统目录"%...

.net中不同程序集的调试

应用场景: 分别有两个.net程序集,各自独立(即在项目的组织上不能将一个程序集与另一个程序集放到一个解决方案中),但是有一个程序集引用了另外程序集 的dll,这时想要通过运行一个程序集调试另一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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