(转载)20分钟读懂程序集

转自:http://www.cnblogs.com/damonlan/p/3221347.html

说到程序集,我刚开始对这个名词特别的郁闷!~。然后 前些天花了些时间 好好读了一下,现在比较清晰了,把一些书上看到的 记下来,以飨读者。希望没浪费你们的时间。

一。程序集是什么

程序集,说白了就是一个 *.dll 或者 *.exe为后缀的文件。当然,如楼下朋友所说,是基于.NET平台的!~。谢谢。

程序集,包括以下部分:

  • Windows 文件首部
  • CLR 文件首部
  • 元数据
  • 程序集清单
  • 可选的内嵌资源

Windows文件首部(知道有这么一个东西就行):就是告诉windows操作系统,本应用程序是ASP.NET 还是Winform还是控制台应用程序。那怎么查文件首部信息呢?

打开VS的命令行工具 然后输入

dumpbin/headers 项目名称

程序集分为2类,私有程序集和共享程序集。

CLR 首部信息:运行于.NET 的程序都是需要这个标志哦!~如果需要查看它,也很简单,

打开VS的命令行工具 然后输入

dumpbin/clrheaders 项目名称

元数据:元素就是.NET 编译后的语言,我们可以打开ILDASM.exe 工具进行查看,然后再按Ctrl +M 打开元数据查看:

程序集清单:就是记录这个程序包含了哪些dll程序以及这个版本是啥等等。。。

二。单文件程序集和多文件程序集

2.1单文件程序集

我们大多数的情况用的都是单文件程序集哦!。这个特别好理解,比如我们新建一个类库工程,然后进行编译,一般来说,编译之后我们会得到一个 *.dll的文件,ok,这个就是单文件程序集啦!~

2.1多文件程序集

好,我们来说说多文件程序集。我们得知道,程序集由什么构成?是模块。所以,多文件程序集就是有多个模块构成的程序集。很遗憾的是,如果我们需要构建多文件程序集,VS IDE 是没法做的,只能通过命令行的csc.exe 命令进行。真辛苦~~~。

(1)在记事本里 写一段简单的code,如下:

复制代码
using System;namespace Person
{public class China{public void DisplayChinese(){Console.WriteLine("I'm Chinese");}}
}
复制代码

然后,打开你VS 命令行,把上面的生成一个模块,命令如下:

csc.exe /t:module China.cs

我们能看到生成了一个:China.netmodule的模块文件。

(2),接着我们在新建一个文件,并且这个文件生成是dll文件。

复制代码
using System;namespace Person
{public class Japan{public void DisplayJapanese(){Console.WriteLine("I'm Japanese");}}
}
复制代码

(3)把刚China.netmodule模块加入到刚需要生成的dll文件中。

命令是:

csc.exe /t:library /out:Lanny.dll Japan.cs /addmodule:China.netmodule

我们能看到生成了一个Lanny.dll的文件。。我们可以把这个文件引入到程序中进行测试。Ok,我们一个多文件程序集就这样程序。但是,我感觉这样的用处不大。

Japan j = new Japan();j.DisplayJapanese();Console.ReadKey();

能弹出“I'm Japanese”,说明我们引用成功了。

三。程序集的分类

程序集分为私有程序集和共享程序集

3.1私有程序集。

(1)啥是私有程序集。顾名思义,私 就是 私有的意思。就是我们新建的项目库中保留的dll 都是私有程序集。比如,在我其中一个MyTestConsle的项目,在Bin/Debug里面都是私有程序集。

(2)配置私有程序集(probing 属性)

一般情况下,我们需要dll,直接copy过去,是的,这样很方便。但是,有的时候,我们需要把dll放到不同的文件中,那么这个时候,就需要进行配置。别担心,特别的简单哦。

比如,我们在C盘下面新建一个 MyTest的文件夹。我把刚的2个程序拷到这里来,并且点击MyTestProject.exe,Ok,可以运行 这样没问题。。

但是,如果我新建一个“MyAllLibraries”文件夹,把我的Lanny.dll 文件放进去,如下图,那我运行,我们都知道 肯定会报错

咋办呢?这个时候就需要我们去配置了。我们在MyTestProject.exe同级下新建一个“MyTestProject.exe.config”文件。入下图:

MyTestProject.exe.config的内容是:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><probing privatePath="MyAllLibraries" /></assemblyBinding></runtime>
</configuration>
复制代码

特别好理解,就是指明程序如果没有找到这个dll文件,那么我去哪里寻找。。。这样,我们就能顺利运行了。不截图了。

(3)使用VS IDE 进行配置

我们能新建Application Configuration File,然后进行配置。这个时候,它会自动把更新的内容更新到相应的 程序名.exe.config中。。

3.2共享程序集

 (1)了解共享程序集

上一节中,我们梳理了下私有程序集,现在我们说下共享程序集。那么它们之间最大的区别是什么呢?它们的本质区别是共享程序集的一个副本可供一台机器上的多个应用程序使用。

比如,我现在新建一个 Windows Forms的程序,里面有一个“MessageBox.Show()”方法,可是很遗憾,你没法再你新创建的应用程序下面找到:System.Windows.Forms.dll的引用,为啥?因为它是共享的程序集。不信 你看下图,我没骗你把。

那么共享文件部署到哪里呢?它安装在GAC(Globle Assemble Cache)中,这个GAC  在下面的目录中。

(2)部署GAC--强命名

部署到GAC之前,一定要给这个程序集赋一个强命名,它就像是.NET中的GUID,是一个唯一标识符。它的作用是用于标识给定.NET二进制文件的发行者。

强命名的组成包括:

  • 程序集的友好名称
  • 程序集的版本号
  • 公钥值
  • 等等。。

那怎么生成强命名呢?有2种方法,一种是命令形式,另外一个VS 图形化,最后的时候附带上。

①生成强命名文件

sn.exe 工具生成一个文件 以 *.snk(strong name key)后缀的文件。

语法是:

sn -k 文件名.snk

②把强命名文件放进程序中

我们只需要把刚我们myTestKey.snk 告诉编译器就好了。那怎么告诉呢?就是把信息写进AssemblyInfo.cs 文件。

③安装强命名的程序集

我们需要使用gacutil.exe 工具。

安装:gacutil.exe -i 程序集名称

查看:gacutil.exe -l 程序集名称

卸载:gacutil.exe -u 程序集名称

 现在我们打开“C:\Windows\assembly”的时候,我们并没有找到刚MyLibrary.dll。原来在.NET 4中,GAC 被分在2个地方。.NET 1.0 到.NET 3.5的基础类库 就放到“C:\Windows\assembly”这里。而且.NET 4 编译下的程序集,是放到“C:\Windows\Microsoft.NET\assembly\GAC_MSIL\”中。。

3.3 使用共享GAC

那我们就导入就好了!!。如果我们导入了一个共享的GAC,这个时候 我们没法再本地程序集下面找到这个程序集,只能在刚我们所说的位置。

3.4图形化配置GAC

①打开properties

我们选择 <New ...>

②创建强命名文件

③显示

转载于:https://www.cnblogs.com/dirichlet/p/3325244.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据胸_喂母乳会导致胸下垂?!你被这个谣言骗了多少年?

很多人认为&#xff0c;给宝宝喂奶会导致胸下垂。有些爱美的妈妈&#xff0c;甚至在宝宝出生6个月后就着急断奶。那么&#xff0c;喂奶真的会导致胸下垂么&#xff1f;给大家讲两个真实的调查结果哈~2004年的一次针对496名新妈妈的调查结果显示&#xff0c;有75%的母乳喂养母亲…

自制ACL+DHCP实验(初版)

&#xff08;实验用gns模拟器&#xff09; ACL 实验拓扑&#xff1a; 实验要求&#xff1a; 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 实验步骤&#xff1a; 步骤一&#xff1a;基本配置 R1&#xff1a; R1#conf t R1(config)#int lo0 R1(config-if…

pil 图像最大值_第97天:图像库 PIL(二)

上节我们讲了 Python 的图像处理库 PIL 的基本图像处理功能&#xff0c;打开了 PIL 的神秘面纱。这节我们接着讲 PIL 的 Image 模块的常用方法。Image 模块的方法convertImage.convert(modeNone, matrixNone, ditherNone, palette0, colors256)参数说明&#xff1a;mode&#x…

c#的委托用法delegate

转载于:https://www.cnblogs.com/douzujun/p/6555886.html

np读取csv文件_被 Pandas read_csv 坑了

-- 不怕前路坎坷&#xff0c;只怕从一开始就走错了方向Pandas 是python的一个数据分析包&#xff0c;纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。Pandas 就是为解决数据分析任务生的&#xff0c;无论是数据分析还是机器学习项目数据预…

铃木uy125摩托车机油_UY125 新瑞梦UM125发布 济南铃木于湖南株洲吹响国IV集结号...

​4月18日&#xff0c;济南铃木在湖南株洲天台开元酒店举行了2019年新品发布会&#xff0c;并于现场发布了两款极具终端战略意义的新款国IV车型&#xff0c;分别为定位“实用运动”的全新个性化踏板车型UY125&#xff0c;以及能够进一步巩固济南铃木在国IV入门级踏板车型领域绝…

js判断时间是早上还是下午_牛奶早上喝好,还是晚上喝好?没想到“最佳时间”是这个点,颠覆了!...

都说喝牛奶好&#xff0c;要多喝。可什么时间喝牛奶最好呢&#xff1f;是饭前、饭后还是睡前&#xff1f;又或者喝酒前&#xff1f;确实得好好说说。传言&#xff1a;空腹时身体比较缺能量&#xff0c;牛奶里的蛋白会去提供能量&#xff0c;不会去构成和修复组织(比如修复皮肤)…

Python TK编程第一部分 Hello Again

当你想写大一点的程序的时候&#xff0c;将你的代码封装到一个或者多个类里会是一个不错的办法。下面hello world这个例子来自Matt Conway的Tkinter Life Preserver. [python]view plain copy from Tkinter import * class App: def __init__(self, master): …

视网膜脱离oct报告图_刚刚,爱尔眼科发布关于艾芬医生诊疗过程的核查报告

刚刚&#xff0c;爱尔眼科医院集团发布关于艾芬女士诊疗过程的核查报告&#xff0c;内容如下&#xff1a;得悉艾芬女士对武汉爱尔眼科医院白内障诊疗存疑&#xff0c;爱尔眼科医院集团高度重视&#xff0c;第一时间成立了工作组奔赴武汉&#xff0c;对事件的诊疗全过程开展了核…

20145233《网络对抗》第二周 后门原理与实践

20145233《网络对抗》第二周 后门原理与实践 实验内容 windows主机与kali虚拟机实现互联互通使用netcat获取主机操作Shell&#xff0c;cron启动使用socat获取主机操作Shell, 任务计划启动使用MSF meterpreter生成可执行文件&#xff0c;利用ncat或socat传送到主机并运行获取主机…

Spring 3.1:缓存和EhCache

如果在网上查找使用Spring 3.1内置缓存的示例&#xff0c;那么通常会碰到Spring的SimpleCacheManager &#xff0c;Spring的家伙说这对“用于测试或简单的缓存声明很有用”。 实际上&#xff0c;我更喜欢将SimpleCacheManager看作是轻量级的&#xff0c;而不是简单的。 在您希望…

mysql-表完整性约束

阅读目录 一 介绍二 not null与default三 unique四 primary key五 auto_increment六 foreign key七 总结一 介绍 回到顶部 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性主要分为&#xff1a; PRIMARY KEY (PK) 标识…

可消费消息数量_17 个方面,综合对比 主流消息队列

一、资料文档二、开发语言三、支持的协议四、消息存储五、消息事务六、负载均衡七、集群方式八、管理界面九、可用性十、消息重复十一、吞吐量TPS十二、订阅形式和消息分发十三、顺序消息十四、消息确认十五、消息回溯十六、消息重试十七、并发度本文将从&#xff0c;Kafka、Ra…

opencv2.4.13+python2.7学习笔记--使用 knn对手写数字OCR

阅读对象&#xff1a;熟悉knn、了解opencv和python。 1.knn理论介绍&#xff1a;算法学习笔记&#xff1a;knn理论介绍 2. opencv中knn函数 路径&#xff1a;opencv\sources\modules\ml\include\opencv2\ml\ml.hpp 3.案例 3.1数据集介绍 我们的目的是创建一个可以对手写数字进行…

热启动必须联网吗_供暖结束,地暖是关闭供水阀门还是关闭回水阀门?你做对了吗?...

天气渐渐暖和起来很多城市都停止供暖了一些家庭也停止使用地暖那么今天就来聊一聊&#xff0c;停止供暖后地暖系统应该怎么保养地暖不用时候是关闭供水阀门还是关闭回水阀门&#xff1f;供暖结束 暖气阀门到底要不要关一般来说&#xff0c;我们供暖期结束是不用关闭总阀门的。因…

python学习(九) 网络编程学习--简易网站服务器

python 网络编程和其他语言都是一样的&#xff0c;服务器这块步骤为&#xff1a;1. 创建套接字2. 绑定地址3. 监听该描述符的所有请求4. 有新的请求到了调用accept处理请求 Python Web服务器网关接口&#xff08;Python Web Server Gateway Interface&#xff0c;简称“WSGI”&…

按条件分类_保税仓储企业能否同时存储非保货物?“仓储货物安装台分类监管”如何申请?...

保税仓储企业能否同时存储非保货物呢&#xff1f;保税和非保货物是不是真的不能同在一个“屋檐下”呢&#xff1f;哪些企业可以开展“仓储货物按状态分类监管”业务&#xff1f;企业又该如何申请该项业务&#xff1f;本文就对这些问题进行一下梳理。什么是“仓储货物按状态分类…

ZooKeeper的原理(转)

一、ZooKeeper的角色 领导者&#xff08;Leader&#xff09;&#xff0c;负责进行投票的发起和决议&#xff0c;更新系统状态。 学习者&#xff08;Learner&#xff09;&#xff0c;包括跟随者&#xff08;Follower&#xff09;和观察者&#xff08;Observer&#xff09;&#…

java课堂笔记

转载于:https://www.cnblogs.com/16-C-kai/p/6567042.html

Spring– DAO和服务层

欢迎来到Spring教程的第三部分。 在这一部分中&#xff0c;我们将继续编写Timesheet应用程序&#xff0c;这次我们将实现DAO层&#xff0c;业务服务并编写一些测试。 在上一部分中&#xff0c;我们定义了GenericDao接口&#xff0c;该接口告诉我们需要对实体执行哪些操作。 现在…