C#程序集(assembly)(精)

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2012.05.02

程序集

应用程序集和应用程序域

-----------------------|----------------------------进程一进程二____________|____________应用程序域A应用程序域B|......____________|____________-----------------------------------------------------进程之间有边界,应用程序域存在于某个进程中,之间也有边界,处在不同应用程序域中的应用程序不能互相访问应用程序域可以互相包含

////FLAG////AppDomain.secondDomain=AppDomain.CreateDomain("NewAppDomain");//创建一个新的应用程序域NewAppDomain

secondDomain.ExecuteAssembly("AssemblyA.exe");//把程序集AssemblyA加载到新域中,通过调用ExecuteAssembly来调用Main()方法}}}

在启动DomainTest.exe前,必须把程序集AssemblyA.exe复制到DomainTest.exe所在的目录下,这样程序才能找到这个程序集,不能添加AssemblyA.exe程序集的引用,因为在VS.NET中,只能给以DLL格式存储的程序集添加引用,不支持EXE格式,但是EXE格式的程序集可以在命令行上执行,如果找不到这个程序集就会抛出System.IO.FileNotFoundExection异常结果:MainindomainNewAppDomaincalled

在上面第二个程序表明的FLAG处可以改为:再创建一个实例,用于替代Main()方法/////////////////////////////////////////////////////////////////////////////////////////AppDomainsecondDomain=AppDomain.CreateDomain("NewAppDomain");

secondDomain.CreateInstance("AssemblyA","Wrox.ProCShap.Assemblies.AppDomains.Class1",true,System.Reflection.BindingFlags.CreateInstance,null,newobject[]{7,3}null,null,null);///////////////////////////////////////////////////////////////////////////////////////////1-程序集名;2-应实例化的类;3-true表示不区分大小写;4-邦定标志枚举值,指定应调用的构造函数;得到的输出为:Constructorwiththevalues7,3indomainNewAppDomaincalled

在运行期间主应用程序域会自动创建,ASP.NET为每个运行在WEB服务器上的Web应用程序创建一个应用程序域,InternetExplorer创建运行托管控件的应用程序域,卸载应用程序域只能通过中断应用程序域来进行

----------------------------------------------------------------------2程序集的结构----------------------------------------------------------------------程序集由=描述它的元数据(程序集元数据)+描述导出类型和方法的类型元数据+MSIL代码+资源存在于一个文件中或分布在多个文件中例如:1程序集由一个文件组成:Component.dll2Component.dll=描述它的元数据+描述导出类型和方法的类型元数据+MSIL代码,资源不在其中这个程序集使用了一个图:Pictrue.jpeg,该图没有嵌入在dll中,而是在程序集的元数据中引用程序集的原数据还引用了一个模块:Util.netmodule,该模块只包含一个类的类型元数据和MSIL代码不包含程序集的元数据,所以这个模块没有版本信息,也不能单独安装这3个文件构成了程序集,这个程序集是一个安装单元,还可以在另外一个文件中放置程序集清单Component.dllUtil.netmodule____________________________________Picture.jpeg<-------程序集元数据-------〉类型元数据__________-------〉IL代码资源类型元数据IL代码

程序集的清单元数据的一部分,描述了程序集和引用它所需的所有信息,并列出,了所有的依赖关系清单=标识(名称,版本,文化,公钥)+属于该程序集的一个文件列表+引用程序集的列表+一组许可请求--运行的许可证+导出的类型(当它们在一个模块中定义,该模块在程序集中引用,否则不属于清单)

---------------------------------------------======================命名空间,程序集和组件1命名空间完全独立于程序集2一个程序集中可以有不同的命名空间3一个命名空间也可以分布在多个程序集中4命名空间只是类名的一种扩展,它属于类名的范畴======================---------------------------------------------

======================私有程序集和共享程序集在使用共享程序集时,程序集必须是唯一的,名称唯一(强名),该名称的一部分是一个强制的版本号,如第三方控件============================================查看程序集命令行工具:ILDASM或FILE-->OPEN-->打开程序集============================================构建程序集1-可以创建模块:csc/target:modulehello.cs模块是一个没有程序集特性的DLL,可以添加到程序集中创建了hello.netmodule2-生成一个程序集B.DLL,它包含模块A.netmodule:csc/target:library/addmodule:A.netmodule/out:B.dll3-模块的作用1是可以更快的启动程序集,因为并不是所有类都在一个文件中模块只在需要时加载2是是否需要使用多种编程语言来创建一个程序集:一个模块用VB.net,一个模块用C#,这两个模块都包含在一个程序集中4-使用VS创建程序集VS2003不支持直接创建模块创建一个项目时,系统自动生成源文件AssemblyInfo.cs,在该文件中可以使用一般的源代码编辑器配置程序集的属性[assembly]和[module]是程序集的全局属性

System.Runtime.CompilerServices命名空间中的类:AssemblyCulture--程序集的文化背景,如en-USAssemblyDelaySign/AssemblyKeyFile/AssemblyKeyName--用于创建共享程序集的强名AssemblyVersion--指定程序集的版本号,版本问题在共享程序集中具有非常重要的地位======================

======================跨语言支持.NET使用通用类型系统CommonTypeSystem-CTS-定义了如何在.net中定义值类型和引用类型,以及这些类型的内存布局但CTS没有确保在任何语言中定义的类型都可以用于其它语言。这应是公共语言规范CommonLanguageSpecification-CLS的任务。CLS定义了.net语言必须支持的最低要求======================

CTS=commontypesystem=通用类型系统CLS=commonlanguagespecification=公共语言规范======================例如:**********************************************************************************VisualC++编写的基类HelloMCPP/继承于HelloMCPP的类HelloVB/继承于HelloVB的类HelloCSharpHelloMCPPHelloVBHelloCSharp+Hello()+Hello()+Hello()+Hello2()+Add()+Add()+Add()+Main()**********************************************************************************--使用VS2003创建一个VC的类-classlibrary(.net)1>HelloMCPP//HelloMCPP.h#pragmaonce#includeusingnamespaceSystem;namespaceWrox{namespaceProCSharp{namespaceAssemblies{namespaceCrossLanguage{public_gcclassHelloMCPP//_gc标记类HelloMCPP,使类成为一个托管类{public:virtualvoidHello(){Console::WriteLine(S"Hello,ManagedC++");}//S作为字符串的前缀,托管的字符串就会写入程序集,并用ldstr推入堆栈virtualvoidHello2()]{printf("Hello,callingnativecode\n");}

intAdd(intval1,intval2){returnval1+val2;}};}}}}**********************************************************************************--使用VS2003创建一个VB.net的类-classlibrary--打开项目属性,在RootNamespace中将项目的根命名空间改为Wrox.ProCSharp.Assemblies.CrossLanguage,这样就改变了类的命名空间--添加对HellpMCPP的引用:Project-->AddReference给项目添加引用就是将引用的程序集复制到VB.net项目的输出目录上(/bin),然后对原引用程序集的改变就是独立的2>HelloVBpublicclassHelloVBInheritsHelloMCPP

publicOverridesSubHello()MyBase.Hello()'MyBase关键字代表基类,此处调用基类的方法Console.WriteLine("Hello,VB.NET")EndSub

publicShadowsFunctionAdd(ByValval1asinteger,_ByValval2asinteger)asinteger'Shadows关键字用来隐藏基类的方法Add(),因为在基类中Add()不是虚拟(virtual)的'不能被重写returnval1+val2EndFunctionEndclass**********************************************************************************--创建一个C#控制台应用程序,添加对HelloVB和HelloMCPP的引用3>HelloCSharpusingSystem;namespaceWrox.ProCSharp.Assemblies.CrossLanguage{publicclassHelloCSharp:HelloVB{publicHelloCSharp(){}

publicoverridevoidHello(){base.Hello();Console.WriteLine("Hello,C#");}

publicnewintAdd(intval1,intval2){returnval1+val2;}

[STAThread]

**********************************************************************************全局程序集缓存查看器全局程序缓存可以使用shfusion.dll来显示,它是一个Windows外壳扩展程序,可以查看和处理缓存的内容Windows外壳扩展程序是一个与Windows资源管理器集成的COMDLL用户启动资源管理器,进入/assembly目录即可可以查看全局程序集的名称,类型,版本,文化和公钥标记,通过查看全局程序集的类型可以确定程序集是否是使用本机图像生成器安装的在该目录下,有GAC和NativeImages_目录,分别是共享程序集的目录和编译为本机代码的程序集

**********************************************************************************公钥的加密对称加密:使用同一个密钥进行加密和解密公钥/私钥加密:使用一个公钥加密,使用对应的私钥解密/使用一个私钥加密,使用对应的公钥解密成对创建公钥和私钥,公钥可以任何人使用,甚至可以放在web站点上,但私钥必须安全的加锁Sarah-->oneemail-->Julian,除了Julian外的人都不能看使用Julian的公钥加密,Julian打开该email,并使用他秘密存储的私钥解密但还有一个问题,Julian不能确保email是Sarah发来的,任何人都可以使用Julian的公钥加密发送email给他解决办法是党Sarah发送email给Julian时,使用Julian的公钥加密邮件之前他添加了自己的签名,再使用自己的私钥加密该签名,然后使用Julian的公钥加密email,这个签名可以使用Sarah的公钥来解密,而Julian可以访问Sarah的公钥,在解密了签名后,Julian就可以确定是Sarah发送了email

**********************************************************************************将公钥/私钥应用于程序集创建共享组件,必须使用公钥/私钥对编译器把公钥写入程序集清单,创建属于该程序集的所有文件的散列表--用私钥标记这个散列表私钥不存储在程序集中,确保没有人可以修改这个程序集,签名可以使用公钥来验证在开发过程中,客户程序集必须引用共享程序集。编译器把引用程序集的公钥写入客户程序集的清单中要减少存储量,就不应把公钥写入客户程序集的清单,而应写入公钥标记,公钥标记是公钥散列表中的最后8位字节,且是唯一的在运行期间加载共享程序集时(如果客户程序集是使用本机图像生成器安装的,则应在安装期间加载),共享程序集的散列表可以使用存储在客户程序集中的公钥来验证,除了私钥的主人外其他人都不能修改共享程序集例如:销售商A创建了一个组件Math,在客户机上引用该组件,黑客的组件就无法替代它,只有私钥的主人才能用新版本来替换原来的共享组件,保证了其完整性

**************************b>安装共享程序集**************************使用全局程序集缓存工具gacutil及其/I选项把它安装到全局程序集缓存中:gacutil/iSharedDemo.dll可以使用全局程序集缓存查看器检查共享程序集的版本,看看它是否安装成功

程序集(assembly)是包含编译好的、面向.NETFramework的代码的逻辑单元。程序集是完全自我描述性的,也是一个逻辑单元而不是物理单元,它可以存储在多个文件中(动态程序集的确存储在内存中,而不是存储在文件中)。如果一个程序集存储在多个文件中,其中就会有一个包含入口点的主文件,该文件描述了程序集中的其他文件。

注意可执行代码和库代码使用相同的程序集结构。惟一的区别是可执行的程序集包含一个主程序入口点,而库程序集则不包含。

程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个称为程序集清单的区域中,可以检查程序集的版本及其完整性。

注意:

ildasm是一个基于Windows的实用程序,可以用于检查程序集的内容,包括程序集清单和元数据。第15章将介绍ildasm。

程序集包含程序的元数据,表示调用给定程序集中的代码的应用程序或其他程序集不需要指定注册表或其他数据源,以便确定如何使用该程序集。这与以前的COM有很大的不同,以前,组件的GUID和接口必须从注册表中获取,在某些情况下,方法和属性的详细信息也需要从类型库中读取。

把数据分散在3个以上的不同位置上,可能会出现信息不同步的情况,从而妨碍其他软件成功地使用该组件。有了程序集后,就不会发生这种情况,因为所有的元数据都与程序的可执行指令存储在一起。注意,即使程序集存储在几个文件中,数据也不会出现不同步的问题。这是因为包含程序集入口的文件也存储了其他文件的细节、散列和内容,如果一个文件被替换,或者被塞满,系统肯定会检测出来,并拒绝加载程序集。

程序集有两种类型:共享程序集和私有程序集。

私有程序集是最简单的一种程序集类型。私有程序集一般附带在某些软件上,且只能用于该软件中。附带私有程序集的常见情况是,以可执行文件或许多库的方式提供应用程序,这些库包含的代码只能用于该应用程序。

系统可以保证私有程序集不被其他软件使用,因为应用程序只能加载位于主执行文件所在文件夹或其子文件夹中的程序集。

用户一般会希望把商用软件安装在它自己的目录下,这样软件包没有覆盖、修改或加载另一个软件包的私有程序集的风险。私有程序集只能用于自己的软件包,这样,用户对什么软件使用它们就有了更多的控制。因此,不需要采取安全措施,因为这没有其他商用软件用某个新版本的程序集覆盖原来的私有程序集的风险(但软件是专门执行怀有恶意的损害性操作的情况除外)。名称也不会有冲突。如果私有程序集中的类正巧与另一个人的私有程序集中的类同名,是不会有问题的,因为给定的应用程序只能使用私有程序集的名称。

因为私有程序集完全是自含式的,所以安装它的过程就很简单。只需把相应的文件放在文件系统的对应文件夹中即可(不需要注册表项),这个过程称为“0影响(xcopy)安装”。

共享程序集是其他应用程序可以使用的公共库。因为其他软件可以访问共享程序集,所以需要采取一定的保护措施来防止以下风险:

●名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名。因为客户机代码理论上可以同时访问这些程序集,所以这是一个严重的问题。

●程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户机代码不兼容。

这些问题的解决方法是把共享程序集放在文件系统的一个特定的子目录树中,称为全局程序集高速缓存(GAC)。与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,而需要专门安装到高速缓存中,这个过程可以用许多.NET工具来完成,其中包含对程序集的检查、在程序集高速缓存中设置一个小的文件夹层次结构,以确保程序集的完整性。

为了避免名称冲突,共享程序集应根据私有密钥加密法指定一个名称(私有程序集只需要指定与其主文件名相同的名称即可)。该名称称为强名(strongname),并保证其惟一性,它必须由要引用共享程序集的应用程序来引用。

因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这个技术称为反射,第11章详细介绍了它们。该技术很有趣,因为它表示托管代码实际上可以检查其他托管代码,甚至检查它自己,以确定该代码的信息。它们常常用于获取特性的详细信息,也可以把反射用于其他目的,例如作为实例化类或调用方法的一种间接方式,如果把方法上的类名指定为字符串,就可以选择类来实例化方法,以便在运行时调用,而不是在编译时调用,例如根据用户的输入来调用(动态绑定)。

THE END
1.在MFC中如何验证C#强命名库唯一标识:强命名程序集依赖于公钥标记(PublicKeyToken),可以唯一标识程序集。 安全性:签名机制确保程序集不能被篡改。 全局程序集缓存(GAC):强命名程序集可以被部署到 GAC 中,供多个应用程序共享。 一个典型的强命名程序集的完整标识包括: 程序集名称 https://blog.csdn.net/wojiuguowei/article/details/144405911
2.签名文件签名文件包含有关一组 F# 程序元素(如类型、命名空间和模块)的公共签名的信息。 它可用于指定这些程序元素的可访问性。 注解 对于每个 F# 代码文件,均可具有签名文件,该文件的名称与代码文件相同,但其扩展名为 .fsi 而非 .fs。 如果你直接使用命令行,签名文件还可添加到编译命令行。 为了区分代码文件和签名文件https://msdn.microsoft.com/zh-cn/library/dd233196.aspx
3.C++并发编程练习10“线程管理之线程ID”std::thread有一个get_id()函数可以唯一标识系统中线程。示例如下 #include <chrono> #include <iostream> #include <string> #include <thread> #include <vector> std::thread::id master; void func(int i) { std::string msg = std::to_string(i); https://www.ctyun.cn/zhishi/p-439374
4.C#给主程序签名及第三方dll强签名操作法号阿兴2、给第三方程序添加强签名方法: 本文以WAPIWrapperCSharp.dll为例,使用vs Tools下的工具命令。 打开命令工具是这个样子, 第一步:生成随机密钥对, 1 C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC>sn -k WAPIWrapperCSharp.snk 第二步:将DLL文件反编译成IL中间语言文件 https://www.cnblogs.com/xuliangxing/p/6708958.html
5.C#程序脱壳,去除强签名由于.net程序的运行机制,利用Reflector,ilspy等反射工具很容易就能看到原代码。很多程序都做了代码混淆,加壳。代码混淆后反编译乱码,不容易理解;加壳使反编译工具不能正常反射,提示无效的程序集。 有些程序还用了强名称程序集 需要做的就是:脱壳、去除强名称、反编译 http://modb.pro/db/180960
6.[已解决]c#签名时出错[已解决] c#签名时出错 技术标签:签名出错 电赛期间忙里偷闲做了上位机, 在调试别人的Demo时出现了一下错误 [error]: 签名时出错: 未在路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\signtool.exe 找到 SignTool.exe。 NADemo &nbhttps://www.pianshen.com/article/9684732267/
7.C#启动程序提示签名时出错:未能对bin\x86\Debug\app.publish\*简介:C# 启动程序提示签名时出错: 未能对 bin\x86\Debug\app.publish\*.exe 签名。 SignTool Error: No certificates we 报错截图 C# 启动程序提示签名时出错: 未能对 bin\x86\Debug\app.publish*.exe 签名。 SignTool Error: No certificates we https://developer.aliyun.com/article/1102754
8.c#实现手写笔签名基于c#手写识别 (中文 文字)示例源码。 上传者:weixin_42680139时间:2021-10-01 asp.net制作手写签名 C# asp.net开发网页版本手写签名功能,也可以扩展连接手写笔使用 上传者:u010051858时间:2016-02-22 C#电子签名功能 一款基于C#开发的电子签名程序,主要实现了签名的保存,适合初学者使用,可将完成的签名保存到指定https://www.iteye.com/resource/lidongxy-4140611
9.C#开发word(wps)插件(com加载项)作为一个web前端开发,不搞点后端这篇文章介绍了用 C#开发 word(wps)插件的全过程。包括需求确认,选定通过 com 加载项实现和 C#技术选型;本地开发的详细步骤,如新建项目、添加引用、新增资源文件和编辑菜单文件等;注册表操作;开发环境启动调试;基础 dll 强签名;Release 打包生成应用 dll;生产部署等环节。 https://juejin.cn/post/5db7d7296fb9a0204c5c35eb
10.stamp:在您的应用程序图标脸上签名gitcommitid,以标识我可以构建阶段时,在ios应用程序图标上签名git commit-id。 设置 首先,要使用图章,您必须在Mac上安装imagemagick和ghostscript命令: brew install imagemagick ghostscript 然后,下载stamp二进制文件: wget https://github.com/ainoya/stamp/releases/download/v0.1.0/stamp -O /usr/local/bin/stamp && chmod +x /ushttps://www.coder100.com/index/index/content/id/2668587
11.计算机科学技术:C#程序设计考试资料(每日一练)考试题库题库试看结束后微信扫下方二维码即可打包下载完整版《★计算机科学技术》题库 手机用户可保存上方二维码到手机中,在微信扫一扫中右上角选择“从相册选取二维码”即可。题库试看结束后微信扫下方二维码即可打包下载完整版《计算机科学技术:C#程序设计》题库,分栏..http://www.91exam.org/exam/87-4187/4187265.html
12.C#程序员经常用到的10个实用代码片段如果你是一个C#程序员,那么本文介绍的10个C#常用代码片段一定会给你带来帮助,从底层的资源操作,到上层的UI应用,这些代码也许能给你的开发节省不少时间。以下是原文: 如果你是一个C#程序员,那么本文介绍的10个C#常用代码片段一定会给你带来帮助,从底层的资源操作,到上层的UI应用,这些代码也许能给你的开发节省不少https://www.51cto.com/article/488667.html
13.C#dll强签名在VS.NET 的命名行窗口下,输入如下的代码。 1 ,生成一个KeyFile sn -k D:/keyPair.snk 2, 得到程序集的MSIL ildasm D:/Aspose.Words.dll /out:D:/Aspose.Words.il 3 ,为了避免冲突,把原来的DLL 文件改名 ren D:/Aspose.Words.dll D:/Aspose.Words.dll.orig http://www.360doc.com/content/18/0411/20/17167475_744829574.shtml
14.C#在PDF中添加不可见数字签名以下经验内容分享在C#程序中如何给PDF文档添加不可见数字签名的方法,即添加签名时不在文档中指定签名位置,在文档正文中不显示相关数字签名信息。下面是具体步骤及方法。另附vb.net代码,有需要可供参考。工具/原料 .net framework4.6.1 Visual Studio2017 PDF 类库Spire.PDF for .NET 7.8.2 .pfx数字证书及密钥https://jingyan.baidu.com/article/ab0b5630991bbc805afa7dac.html
15.无法在android应用程序上显示测试广告(Admob)在Android应用程序上无法显示测试广告(AdMob)可能是由于以下几个原因导致的: 1. AdMob配置错误:请确保你正确地集成了AdMob SDK并在应用程序中正确配置了AdMob广告单元的Ihttps://cloud.tencent.com.cn/developer/information/%E6%97%A0%E6%B3%95%E5%9C%A8android%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%8A%E6%98%BE%E7%A4%BA%E6%B5%8B%E8%AF%95%E5%B9%BF%E5%91%8A(Admob)
16.C#实现PDF签名时添加时间戳的2种方法(附VB.NET代码)C#教程在PDF添加签名时,支持添加可信时间戳来保证文档的法律效应。本文,将通过C#程序代码介绍如何添加可信时间戳,可通过2种方法来实现。感兴趣的可以了解一下GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 在PDF添加签名时,支持添加可信时间戳来保证文档的法律效应。https://www.jb51.net/article/213504.htm