程序集和全局程序集缓存_第1页
程序集和全局程序集缓存_第2页
程序集和全局程序集缓存_第3页
程序集和全局程序集缓存_第4页
程序集和全局程序集缓存_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序集和全局程序集缓存(c#编程指南)程序集是任何.net framework应用程序的基本构造块。例如,在生成简单的c#应用程序 吋,visual studio创建一个单个可移植可执行(pe)文件形式的程序集,明确地说就是一 个exe或dll。程序集包含描述它们自己的内部版本号和它们包含的所有数据和对象类型 的详细信息的元数据。程序集仅在需要时才加载。如果不使用程序集,则不会加载。这意味 着程序集可能是在大型项目屮管理资源的有效途径。程序集可以包含一个或多个模块。例如,计划较大的项目时,可以让儿个各个开发人员负责 单独的模块,并通过组合所有这些模块来创建单个程序集。程序集概述程序集具有以下特

2、点:程序集作为.exe或.dll文件实现。通过将程序集放在全局程序集缓存中,可在多个应用程序之i'可共亨程序集。要将程序集放在全局程序集缓存中,必须对程序集进行强命名。程序集仅在需要时才加载到内存中。可以使用反射来以编程方式获取关于程序集的信息。 如果加载程序集的目的只是对其进行检查,应使用诸如reflectiononlyloadfrom 的方法。可以在单个应用程序中使用相同程序集的两个版本。创建多文件程序集用于c#和visual basic的visual studio 2005 ide只能用于创建单文件程序集。如果 要创建多文件程序集,必须使用命令行编译器或带有visual c卄 的

3、visual studio 2005o 下面的示例通过编译包含其他文件所引用的命名空间的文件,来阐释上述过程的步骤1。此 示例开始时是stringer文件的一些简单代码,stringer具有名为mystringer的命名空 间(带有名为stringer的类)。stringer类包含名为stringermethod的方法,此方法 将单独一行写入控制台。c#复制代码/ assembly building example in the . net framework.using system;namespacc mystringerpublic class stringerpublic void s

4、tringermethod()system. console. writelinec'this is a line from stringetmethod.");使用下面的命令编译此代码:c#复制代码esc /1:module stringer. cs使用/t:编译器选项指定module参数,表明文件应作为模块(而不是作为程序集)编译。 编译器生成名为stringer, netmodule的模块,该模块可添加到程序集。在上述过程的笫二步中,必须编译包含对其他模块的引用的模块。此步骤使用/addmodule 编译器选项。在下面的示例中,名为client的代码模块具有入口点mai

5、n方法,此方法引 用步骤1中创建的stringer, dll模块中的方法。下面的示例说明了 client的代码。c#复制代码using system;using mystringer; /the namespace created in stringer. netmodule.class mainclientapp/ static method main is the entry point method.public static void main()stringer mystringinstancc = new stringer();con sole. writeline (,zc1 i

6、e nt code executes");/mystringcomp. stri nger();mystringlnstanee. stringermethod();使用下面的命令编译此代码:c#复制代码esc /addmodule:stringer, netmodule /t:module client, cs指圧/t:module选项,因为此模块将在以后的步骤中添加到程序集。指定/addmodule选 项,因为client中的代码引用stringer, netmodule中的代码创建的命名空i'可。编译器生 成名为cl ient. netmodule的模块,它包含对另一模

7、块stringer, netmodule的引用。两次编译创建出一个双文件程序集:esc /t:module stringer, csesc client.es /addmodule:stringer. netmodule 一次编译创建出一个双文件程序集:esc /out:client. exe client. cs /out:smodule stringer.cs此示例测试一个dll以确定它是否为程序集。c#心复制代码class testassemblystatic void main()trysystem. reflection. assemblyname testassembly -sys

8、tem. ref lection. assemblyxame. getassemblyxame c: windows systemavicap. dll" );system. console. writeline("yes, the file is an assembly.z/);catch (system. to. fi1enotfoundexception e)system. console. writeline (z/the file can not be found.z/);catch (system. badtmageformatexception e)syste

9、m. console. writeline (z/the file is not an assembly. z,);catch (system. to. fileloadexception e)system. console. writeline("the assembly has already been loaded.,z);getassemblyname方法加载测试文件,然后在读取信息之后释放它。 输出the file is not an assembly.请考虑下而的文件,它创建一个包含一个命名空间和两个类的程序集。假设此程序集已经生 成,并以helloworldremote

10、. exe为名存储在驱动器c上。c#召复制代码/ this namespace contains code to be cal space hellowor1dremotepublic class remoteobject : system. marshalbyrefobjectpublic remoteobject()system. console. writeline("hello, world! (remoteobjectconstructor)“);class programstatic void main()system. console. writelin

11、e (z,hello, worl d! (main method)z,);|为了从其他应用程序访问该代码,可以将该程序集加载到当前应用程序域中,或创建新的应 用程序域并将该程序集加载到其川。如杲使用assembly. loadfrom将程序集加载到当前应 用程序域中,您可以使用assembly. createlnstance来实例化remoteobject类的实例, 这样将导致执行对象构造函数。c#却复制代码static void maino/ load the assembly into the current appdomain:system. reflection. assembly n

12、ewassembly =systcm. ref lection. assembly. loadfrom(,zc:hc11 oworidremote. exe");/ instantiate remoteobject:new a ssembly. create in sta nceclielloworldremote. rem ot eobject");|将程序集加载到一个单独的应用程序域时,应使用appdomain. executeassembly来访问默 认入口点,或使用appdomain. createlnstance创建remoteobject类的实例。创建该实 例将

13、导致执行构造函数。c#也复制代码static void mainosystem. appdomain newappdomain =system. appdomain. createdomai n("newappli cationdomai n");/ load the assembly and call the default entry point:newappdomain. executeasscmb 1 y (,zc:he 11owor 1 dremote. exez,);/ create an instance of remoteobject:newappdomai

14、n. createtnstancefrom("c:iiel1oworldremote.exe",z,hel 1 oworl dremote. remoteobject");i如果不想以编程方式加载程序集,可以从“解决方案资源管理器”中使用“添加引用”來指 定程序集helloworldremote.exe。然后向应用程序的using块中添加一个using holloworldrcmote;指令,并在程序中使用remoteobject类型来声明remoteobject对 彖的一个实例,如下所示:c#总复制代码static void maino/ this code c

15、reates an instancc of remoteobject, assumi ng helloworldremote has been added as a reference:hel1owor1dremote. remoteobject o 二 new helloworldremote. remoteobject();i应当仅在需要吋才将程序集安装到全局程序集缓存中以进行共亨。一般原则是:程序集依赖 项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集。另外,不必为了 使com interop或非托管代码可以访问程序集而将程序集安装到全局程序集缓存。 有若干方法可以将程序集部署到全局程序集缓存中: 使用专用于全局程序集缓存的安装程序。该方法是将程序集

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论