C#知识:.NET程序集(Assembly)

 

①什么是程序集?
可以把程序集简单理解为你的.NET项目在编译后生成的*.exe或*.dll文件.
嗯,这个确实简单了些,但我是这么理解的.详细:
http://blog.csdn.net/sws8327/archive/2006/09/21/1244642.aspx

②程序集和命名空间的区别?
一个程序集可以跨越n个命名空间,一个命名空间也可以包含n个程序集.(估计你该晕了)

如果说命名空间是类库的逻辑组织形式,那么程序集就是类库的物理组织形式。只有同时指定类型所在的命名空间及实现该类型的程序集,才能完全限定该类型。(摘抄自《精通.NET核心技术--原来与架构》   电子工业出版社)

也就是说,你要创建一个类的实例,必须知道该类的  命名空间(这个一般都知道)+程序集(这个很容易被我们忽略,因为一般我们不需要引用外部的程序集,如果你用C#做过Excel文件的导入导出,就会知道必须添加一个Excel相关的程序集引用)

③怎样通过命令行创建程序集?
我对命令行向来反感,如果你想知道,look here:
http://www.cnblogs.com/3echo/archive/2006/02/14/330579.html
 

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("TestSNK")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestSNK")]
[assembly: AssemblyCopyright("Copyright ©  2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("f058c65f-4ce7-4880-95a4-0ecaf19dd852")]

// 程序集的版本信息由下面四个值组成:
//
//      主版本
//      次版本 
//      生成号
//      修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

 

以上文件,实际上相当于图片水印这个概念,给整个程序自定义一些信息,不过我们是通过项目右键属性来查看定义

 

那么另外一个问题,Web.Config文件中,指定程序集引用信息,如上所示,什么含义呢?

Culture=neutral指明为中立,即使用没有区域限制,那么PublickToken是什么,项目中有什么用呢?

初步得到答案,如何自定义程序集,生成这个东西,

对于window10,基本电脑操作,都不太熟悉,如何管理员允许cmd.exe都要百度,真惭愧

开始 右键 运行 cmd 得知cmd.exe文件目录位置,找到这个位置,右键选中,管理员运行即可

sn.exe文件是跟随Vs一起的工具,最终找到路径是在如下位置:

生成私钥文件:

生成私钥文件,并查看最终公钥 

在工程-》属性-》左侧 签名选项,给程序集签名。第一步,打对号。第二步,加载私钥文件Task.snk,CTRL+S保存。

在项目中为了方便查看公钥,可以打开菜单 工具-》扩展工具下,设置如下。Command设置sn.exe存在的路径。

可以看到工具栏有了增加的功能,点击就可以更方便查看,不用通过CMD命令板了。

 

顺便说一句,为程序集创建一个强名称作用是,利用全局程序集缓存(GAC),开发者就可与机器上的其他应用程序共享程序集,如何注册呢? 在C:\windows\system32\gacutil.exe工具进行注册,详细不深究。

 

言归正传:我们苦苦寻觅的Assembly里面到底是什么东西?有什么值得我们去苦苦探究的?
其实在上面的AssemblyInfo.cs代码中,我们已经看出来一些东西,它里面包含该Assembly的名称/产品/描述/拷贝权..(鬼才关心)和版本号(这个很重要,但我觉得还是没什么太大的用处,是dll Hell 的克星,顺带说一句,同一Assembly名称的不同版本号的Assembly可同时运行),还有一个密钥的概念,共享程序集和部署用的,看了半天没看明白,就不误人子弟了.  
那Assembly的主要用处是:
ⅰ与反射Reflection结合起来用,动态创建你所需要的类!!
ⅱ与反射Reflection结合起来用,获得Assemble里类的信息
(据可靠的小道消息说Assembly里存的是一张包含元数据类名什么的表) 
ⅲ使用别人已封装好的类.

程序集是任何 .NET Framework 应用程序的基本构造块。例如,在生成简单的 C# 应用程序时,Visual Studio 创建一个单个可移植可执行 (PE) 文件形式的程序集,明确地说就是一个 EXE 或 DLL。 
程序集概述 
程序集具有以下特点: 

程序集作为 .exe 或 .dll 文件实现。 

通过将程序集放在全局程序集缓存中,可在多个应用程序之间共享程序集。 

要将程序集放在全局程序集缓存中,必须对程序集进行强命名。 

程序集仅在需要时才加载到内存中。 

可以使用反射来以编程方式获取关于程序集的信息。 

如果加载程序集的目的只是对其进行检查,应使用诸如 ReflectionOnlyLoadFrom 的方法。 

可以在单个应用程序中使用相同程序集的两个版本。

 

Assembly能干什么?
我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。

 

引用:

https://blog.csdn.net/msbls5/article/details/42167839

https://www.cnblogs.com/yunangel/p/5651032.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值