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

下载本文档

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

文档简介

程序集和全局程序集缓存(C# 编程指南)程序集是任何 .NET Framework 应用程序的基本构造块。例如,在生成简单的 C# 应用程序时,Visual Studio 创建一个单个可移植可执行 (PE) 文件形式的程序集,明确地说就是一个 EXE 或 DLL。程序集包含描述它们自己的内部版本号和它们包含的所有数据和对象类型的详细信息的元数据。程序集仅在需要时才加载。如果不使用程序集,则不会加载。这意味着程序集可能是在大型项目中管理资源的有效途径。程序集可以包含一个或多个模块。例如,计划较大的项目时,可以让几个各个开发人员负责单独的模块,并通过组合所有这些模块来创建单个程序集。程序集概述程序集具有以下特点: 程序集作为 .exe 或 .dll 文件实现。 通过将程序集放在全局程序集缓存中,可在多个应用程序之间共享程序集。 要将程序集放在全局程序集缓存中,必须对程序集进行强命名。 程序集仅在需要时才加载到内存中。 可以使用反射来以编程方式获取关于程序集的信息。 如果加载程序集的目的只是对其进行检查,应使用诸如 ReflectionOnlyLoadFrom 的方法。 可以在单个应用程序中使用相同程序集的两个版本。创建多文件程序集用于 C# 和 Visual Basic 的 Visual Studio 2005 IDE 只能用于创建单文件程序集。如果要创建多文件程序集,必须使用命令行编译器或带有 Visual C+ 的 Visual Studio 2005。下面的示例通过编译包含其他文件所引用的命名空间的文件,来阐释上述过程的步骤 1。此示例开始时是 Stringer 文件的一些简单代码,Stringer 具有名为 myStringer 的命名空间(带有名为 Stringer 的类)。Stringer 类包含名为 StringerMethod 的方法,此方法将单独一行写入控制台。 C#复制代码/ Assembly building example in the .NET Framework.using System;namespace myStringer public class Stringer public void StringerMethod() System.Console.WriteLine(This is a line from StringerMethod.); 使用下面的命令编译此代码:C#复制代码csc /t:module Stringer.cs使用 /t: 编译器选项指定 module 参数,表明文件应作为模块(而不是作为程序集)编译。编译器生成名为 Smodule 的模块,该模块可添加到程序集。在上述过程的第二步中,必须编译包含对其他模块的引用的模块。此步骤使用 /addmodule 编译器选项。在下面的示例中,名为 Client 的代码模块具有入口点 Main 方法,此方法引用步骤 1 中创建的 Stringer.dll 模块中的方法。下面的示例说明了 Client 的代码。C#复制代码using System;using myStringer; /The namespace created in Smodule.class MainClientApp / Static method Main is the entry point method. public static void Main() Stringer myStringInstance = new Stringer(); Console.WriteLine(Client code executes); /myStringComp.Stringer(); myStringInstance.StringerMethod(); 使用下面的命令编译此代码:C#复制代码csc /addmodule:Smodule /t:module Client.cs指定 /t:module 选项,因为此模块将在以后的步骤中添加到程序集。指定 /addmodule 选项,因为 Client 中的代码引用 Smodule 中的代码创建的命名空间。编译器生成名为 Cmodule 的模块,它包含对另一模块 Smodule 的引用。 两次编译创建出一个双文件程序集: csc /t:module Stringer.cscsc Client.cs /addmodule:Smodule 一次编译创建出一个双文件程序集: csc /out:Client.exe Client.cs /out:Smodule Stringer.cs此示例测试一个 DLL 以确定它是否为程序集。C#复制代码class TestAssembly static void Main() try System.Reflection.AssemblyName testAssembly = System.Reflection.AssemblyName.GetAssemblyName(C:WINDOWSsystemavicap.dll); System.Console.WriteLine(Yes, the file is an Assembly.); catch (System.IO.FileNotFoundException e) System.Console.WriteLine(The file cannot be found.); catch (System.BadImageFormatException e) System.Console.WriteLine(The file is not an Assembly.); catch (System.IO.FileLoadException e) System.Console.WriteLine(The Assembly has already been loaded.); GetAssemblyName 方法加载测试文件,然后在读取信息之后释放它。输出The file is not an Assembly.请考虑下面的文件,它创建一个包含一个命名空间和两个类的程序集。假设此程序集已经生成,并以 HelloWorldRemote.exe 为名存储在驱动器 C 上。C#复制代码/ This namespace contains code to be space HelloWorldRemote public class RemoteObject : System.MarshalByRefObject public RemoteObject() System.Console.WriteLine(Hello, World! (RemoteObject Constructor); class Program static void Main() System.Console.WriteLine(Hello, World! (Main method); 为了从其他应用程序访问该代码,可以将该程序集加载到当前应用程序域中,或创建新的应用程序域并将该程序集加载到其中。如果使用 Assembly.LoadFrom 将程序集加载到当前应用程序域中,您可以使用 Assembly.CreateInstance 来实例化 RemoteObject 类的实例,这样将导致执行对象构造函数。C#复制代码static void Main() / Load the assembly into the current appdomain: System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(c:HelloWorldRemote.exe); / Instantiate RemoteObject: New Assembly.CreateInstance(HelloWorldRemote.RemoteObject);将程序集加载到一个单独的应用程序域时,应使用 AppDomain.ExecuteAssembly 来访问默认入口点,或使用 AppDomain.CreateInstance 创建 RemoteObject 类的实例。创建该实例将导致执行构造函数。C#复制代码static void Main() System.AppDomain NewAppDomain = System.AppDomain.CreateDomain(NewApplicationDomain); / Load the assembly and call the default entry point: NewAppDomain.ExecuteAssembly(c:HelloWorldRemote.exe); / Create an instance of RemoteObject: NewAppDomain.CreateInstanceFrom(c:HelloWorldRemote.exe, HelloWorldRemote.RemoteObject);如果不想以编程方式加载程序集,可以从“解决方案资源管理器”中使用“添加引用”来指定程序集 HelloWorldRemote.exe。然后向应用程序的 using 块中添加一个 using HelloWorldRemote; 指令,并在程序中使用 RemoteObject 类型来声明 RemoteObject 对象的一个实例,如下所示:C#复制代码static void Main() / This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference: HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();应当仅在需要时才将程序集安装到全局程序集缓存中以进行共享。一般原则是:程序集依赖项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集。另外,不必为了使 COM interop 或非托管代码可以访问程序集而将程序集安装到全局程序集缓存。有若干方法可以将程序集部署到全局程序集缓存中: 使用专用于全局程序集缓存的安装程序。该方法是将程序集安装到全局程序集缓存

温馨提示

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

评论

0/150

提交评论