当前位置: 首页 > 编程日记 > 正文

浅析.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可以将具有强名称的程序集添至全局程序集缓存。命令格式为:

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日

相关文章:

“崩溃!我再也不搞 AI 了”谷歌 AI 专家:别让你的方法打败你!

今天&#xff0c;想跟大家聊聊 Python 人工智能。最近几年&#xff0c;我看过市面上很多 Python和人工智能的教程&#xff0c;基本都是先介绍Python基本语法、dict、tuple 等基本库的使用&#xff0c;最后学习机器学习、深度学习的常用算法......但我与 Google 人工智能开发专家…

Spring MVC 相关资料整理

来源于&#xff1a;http://www.cnblogs.com/ylhssn/p/4062757.html 1、概述 Spring MVC是一种基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;即使用了MVC架构模式的思想&#xff0c;将web层进行解耦&#xff0c;基于请求-响应模型帮助我们简化日常web系统的…

Wireless-N Configuration

Wireless-N Configuration/Zh CnContents [hide]1 关于Wireless N的一般信息2 基本设置2.1 20 MHz vs 40 MHz2.1.1 2.4GHz频段的描述2.1.2 2.4GHz频段表2.2 无线安全设置2.3 高级设置3 Problems and Resolution3.1 Actual Speeds3.2 Testing3.3 Device Drivers4 Device Specifi…

为.Net程序集添加资源

作者&#xff1a;宋华 本文选自&#xff1a;赛迪网 2002年12月06日 在.Net结构中&#xff0c;程序集Assembly(也称着程序集或托管Dll)是自我描述的安装单元&#xff0c;它可以只包括一个PE&#xff08;可移植可执行&#xff09;格式的Dll或exe文件&#xff0c;也可以由多…

这5个 AI 用例,转变了传统商务沟通

作者&#xff5c;Lanre Onibalusi译者 |天道酬勤&#xff0c;责编 | 晋兆雨封图 | CSDN 付费下载自视觉中国很少有人会想到这样一种情景&#xff1a;世界上几乎有一半的国家处于封锁状态&#xff08;可能长达数周或几个月&#xff09;&#xff0c;并且大多数人的工作能力也受到…

cocos2dx 3.x(动态改变精灵的背景图片)

//更换精灵CCSprite的图片有两种方式。 //直接通过图片更换 //使用setTexture(CCTexture2D*)函数&#xff0c;可以重新设置精灵类的纹理图片。 // auto bg Sprite::create(); Texture2D* texture Director::getInstance()->getTextureCache()->addImage("bg2.png&…

如何在.NET中创建服务型组件

作者&#xff1a;张劲松 本文选自&#xff1a;赛迪网 2002年12月03日 对于在WINDOWS上作过一些开发的程序员来说&#xff0c;COM&#xff0b;应该是不会感到陌生的吧。COM&#xff0b;代表了Microsoft在COM技术平台上的最高水平&#xff0c;也是Microsoft藉以和J2EE抗衡的…

flex viewstack的简单应用

1 Flex API里面介绍viewstack&#xff1a; MX ViewStack 导航器容器由一组彼此上下堆叠的子容器组成&#xff0c;其中一次只可以显示一个子容器。选择另一个子容器后&#xff0c;它将显示在原来子容器的位置处&#xff0c;所以看起来好像此子容器替换了原来的子容器。…

在线等:“实习拿到两个不太好的offer,去腾讯还是去阿里?”

“你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间&#xff0c;这是我们最战战兢兢的心情。但是显然&#xff0c;有些人体会不了。这份行业数据&#xff0c;让笔者“柠檬”了。1疫情下&#xff0c;有的公司宣布破产有的公司增长413%疫情期间&#xff0c;人工智能的价值…

如何成功地在亚洲植入敏捷和DevOps

\关键要点\\首先要植入西方文化的要素。\\t使用价值流映射有助于打破文化障碍。\\t让上层管理者参与进来。\\t黑客节&#xff08;Hackfest&#xff09;将有助于减少前置期时间。\\t理解文化差异的影响。\\\我读过的一篇文章说Scrum并不适合于亚洲。作者所说的非常正确&#xff…

浅析.Net下的AppDomain编程

作者&#xff1a;宋华 发文时间&#xff1a;2002 我们知道&#xff0c;进程是操作系统用于隔离众多正在运行的应用程序的机制。在&#xff0e;Net之前&#xff0c;每一个应用程序被加载到单独的进程中&#xff0c;并为该进程指定私有的虚拟内存。进程不能直接访问物理内存&…

AI 医生正式上岗了?AI 医疗结合迎爆发点!

作者 | 硬核云顶宫责编 | 晋兆雨封图 | CSDN 付费下载自视觉中国这些年&#xff0c;人工智能应用于医学界是非常热的话题。在医学三大杂志——新英格兰医学杂志、柳叶刀、JAMA上&#xff0c;AI与医疗相结合的论文&#xff0c;占比越来越高。其中最明显的趋势是将医生从繁重的诊…

Android之解析Android Map地图返回的Json数据

先上一下需要解析的Json数据&#xff1a;{"results" : [{"address_components" : [{"long_name" : "荔湾区","short_name" : "荔湾区","types" : [ "sublocality", "political" ]}…

9成P2P平台面临出局,千亿资本何去何从?

【阅读原文】作者&#xff1a;楠沨据研究院数据中心统计&#xff0c;截至2016年10月底&#xff0c;我国 P2P贷款余额已经攀升至7,470亿元左右&#xff0c;环比增长6.0%。进入10月份百强榜的平台&#xff0c;其贷款余额总计3,275亿元&#xff0c;占到整个行业的44%&#xff1b;榜…

关于Transformer,那些的你不知道的事

作者 | 小莫来源 | 阿泽的学习笔记&#xff08;ID: aze_learning&#xff09;引言本博客主要是本人在学习 Transformer 时的「所遇、所思、所解」&#xff0c;通过以 「十六连弹」 的方式帮助大家更好的理解该问题。十六连弹为什么要有 Transformer?Transformer 作用是什么&am…

用ASP.NET上传大文件

作者&#xff1a;思归 微软MVP http://blog.joycode.com/saucer/我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题&#xff0c;因为ASP.NET会block直到把整个文件载入内存后&#xff0c;再加以处理。实际上&#xff0c;如果…

中国最齐全的主要电子商务网站(B2C)

中国最齐全的主要电子商务网站(B2C)------[连载之电子商务网站架构]访问量超过100万的电子商务网站技术架构版本&#xff1a;V1出处&#xff1a;http://jimmyli.blog.51cto.com/ 我站在巨人肩膀上Jimmy Li作者&#xff1a;Jimmy Li关键词&#xff1a;中国 电子商务 网站 B2C连接…

怎么安装MYSQL5.0的JDBC驱动

1、下载mysql for jdbc driver. http://dev.mysql.com/downloads/connector/j/3.1.htmlMySQL Connector/J is distributed as a .zip or .tar.gz archive containing the sources and class files as well as a class-file only "binary" .jar archive named "…

ASP.NET中的事务处理和异常处理

刘彦青编译 来自&#xff1a;yesky 使用SQL-Transaction类和.NET提供的异常处理机制&#xff0c;我们就能够以一种可靠的方式处理数据库运行中的问题和发现系统异常。这篇小文章将解释事务处理和异常处理的概念和用法。 什么是事务&#xff1f; 事务处理是由以一个单一的…

2020年AI产业报告:100个岗位抢1个人,计算机视觉成最大缺口

“你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间&#xff0c;这是我们最战战兢兢的心情。但是显然&#xff0c;有些人体会不了。这份行业数据&#xff0c;让笔者“柠檬”了。1疫情下&#xff0c;有的公司宣布破产有的公司增长413%疫情期间&#xff0c;人工智能的价值…

.NET Winform也能画出类似QQ、飞信这样的窗口风格和控件效果

MPN企业宝智能升级程序界面采用.NET的Winform技术&#xff0c;并没有延续企业宝主程序的绘制界面技术——WPF。直接采用Winform实现类似QQ和飞信的窗口风格比较困难&#xff0c;WPF好在还有一个Blend设计工具&#xff0c;而Winform只能靠自己一个一个像素去对齐、去仔细看&…

【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

转自&#xff1a;http://blog.csdn.net/paincupid/article/details/47746341 一、HashMap和TreeMap区别 1.HashMap是基于散列表实现的&#xff0c;时间复杂度平均能达到O(1)。 TreeMap基于红黑树&#xff08;一种自平衡二叉查找树&#xff09;实现的&#xff0c;时间复杂度平均…

ASP.NET实现数据图表

作者&#xff1a;马金虎 来自&#xff1a;yesky 在ASP中插入图表&#xff0c;常用的方法是使用MSChart控件。那么在ASP.NET是否也是这样呢?答案是不可以的。 我们知道ASP.NET是一种编译语言&#xff0c;当客户端第一次调用ASP.NET页面的时候&#xff0c;其实是经过了一种…

Struts2基础(1)_MVC

2019独角兽企业重金招聘Python工程师标准>>> Struts2是有传统的Struts1和WebWork两个经典MVC框架发展起来&#xff0c;无论从Struts2的设计角度或则实际项目中的易用性来开&#xff0c;它都是一个非常优秀的MVC框架。 MVC的理解&#xff1a;MVC思想将应用中各组件按…

我发现了个Python黑魔法,执行任意代码都会自动念上一段「平安经」

来源 | Python编程时光最近的"平安经"可谓是引起了不小的风波啊。作为一个正儿八经的程序员&#xff0c;最害怕的就是自己的代码上线出现各种各样的 BUG。为此&#xff0c;明哥今天分享一个 Python 的黑魔法&#xff0c;教你如何在你执行任意 Python 代码前&#xff…

Java第一天学习笔记整理

一、关键字 java的关键字对java的编译器有特殊的意义&#xff0c;他们用来表示一种数据类型&#xff0c;或者表示程序的结构等&#xff0c;关键字不能用作变量名、方法名、类名、包名。 常见的关键字&#xff1a; 用于定义数据类型的关键字 class interface byte short int lon…

ASP.NET中树形图的实现

来自&#xff1a;DotNET中文技术网 树形图用于显示按照树形结构进行组织的数据&#xff0c;其用途比较广泛&#xff0c;如计算机中的文件系统(Windows中的资源管理器)、企业或公司的组成结构等。我们知道在Windows下VB、PB、Delphi等工具提供了一个功能很强的树型控件TreeView…

同步你的手机联系人

从web1.0到2.0,我们进入了一个新的互联网时代移动时代.相信你的手机中,有许多联系人信息,你肯定不想把他们弄丢吧,像我之前隔一段时间就备份下,存到电脑中.现在再也不怕联系人信息丢了,只需要一个账户,同步一下,所有联系人信息都回来了.我是在Android智能手机上操作的,IOS就不清…

AI 技术发展飞快,高校 AI 教师的知识储备能满足学生旺盛的求知欲吗?

2019 年&#xff0c;AI 技术以惊人的速度发展&#xff1b;2020 年&#xff0c;AI 技术成熟的时机已经到来&#xff0c;随之而来的&#xff0c;是越来越旺盛的 AI 人才需求。近日&#xff0c;国家正式发布了一份《2020 年人工智能产业人才发展报告》显示&#xff0c;2020 年人工…

Windows Server 2008 R2安装子域控制器

一、实验网络拓扑图&#xff1a; 二、实验说明&#xff1a; 子域控制器安装前需要先把主域控制器安装好&#xff0c;然后子域控制器的DNS先指向主域控制器的IP地址 192.168.10.30&#xff0c;主域控制器委派DNS给子域控制器后再把子域控制器DNS指向自己的IP地址 192.168.10.31即…