这两个概念MSDN对它们有相关的说明,但是不好理解。个人对它们的理解:程序集是发布的软件的基本单元(exe或dll);应用程序域是应用程序的运行空间,调用一个或多个程序集。
程序集(assembly)
“程序集是包含编译好的、面向.NET Framework的代码的逻辑单元”
这句话可以理解如下:
首先:程序集是代码的逻辑单元,是逻辑上的概念。它不完全等价于编译好的DLL物理文件,但一般我们认为静态专用程序集与编译出的DLL文件或EXE文件是一致的。
其次:它是被编译好的。它不是项目名称或命名空间,更不是源代码。
最后:它是是面向.NET Framework的。意味着它虽然被编译了,但仍需要依托于.NET Framework来运行。
一个程序集可以是一个包括元数据的DLL或EXE,也可以由多个文件组成,例如资源文件、元数据、DLL和EXE。
注意:Win32的DLL(动态链接库)和DotNet中的DLL(程序集文件)的扩展名虽然都是DLL,但是二者内部的数据组织是不一样的,所以千万不要把二者混为一谈。
程序集的分类:
静态程序集和动态程序集:
静态程序集:静态程序集包括中间语言元数据(MSIL,类似于Java字节码的东西),以及该程序集的资源(位图、JPEG 文件、资源文件等)。静态程序集存储硬盘文件中。
动态程序集:动态程序集直接从内存运行并且在执行前不存储到磁盘上,如ASP.NET 2.0中的网站程序运行的时候产生的是动态程序集。
专用程序集和共享程序集:
专用程序集一般附带在某些软件上,且只为该软件提供专用的类库,这些库包含的代码只能用于该应用程序。一般专用程序集是与应用程序放在同一目录下的,在部署的时候与应用程序一起复制到目标机器上即可。
共享程序集是其他应用程序可以使用的公共库,一般是安装到系统GAC中。因为其他软件可以访问共享程序集,所以所有共享程序集必须带有强名称(由发行者签名)。
本地应用程序目录可用于存储专用程序集,所以专用程序集一般不会有版本冲突问题。其他应用程序都不会重写私有的程序集。当然,仍可以使用私有程序集的版本号,这样有助于代码的修改与管理,但它不是.NET所必须的。这种专用程序集是大多数程序员所喜欢的,它可以很好地避免DLL Hell的问题。但这种专用程序集只能部署在应用程序所在的目录之中,而无法像以往的Win32 DLL那样放置在System32目录中供多个应用程序共享,但有的时候设计人员仍有共享程序集的需求(把程序集部署到GAC目录中),这样一来又带来了我们似乎又看到DELL HELL又在慢慢地逼近我们,其实DLL共享程序集中根本不可能出现DELL HELL。因为共享程序集并不是简单地把私有程序集复制到GAC所在目录中,开发人员只能使用相关工具把强命名程序集(Strong-name Assembly)放在GAC所在目录中。在GAC中可以允许同名称但是不同版本号的程序集存在,当不同版本的强命名程序集安装在GAC中后,不同的应用程序会根据版本号信息去调用不同的程序集,这样就不会产生DLL程序集冲突的问题了。
应用程序域(AppDomain)
在操作系统中,程序和程序之间应实现某种形式的隔离,防止程序和程序之间产生不可预知的影响,这种隔离是必须的。在DotNet技术之前,通常采用进程来形成隔离边界。每一个应用程序被加载到单独的进程中,每个进程都有其私有的内存,运行在一个进程中的应用程序不能写入另一个应用程序的内存,您也不能在两个进程间进行直接调用。
在.NET结构中,应用程序有一个新的边界:应用程序域。应用程序域是一个用于隔离应用程序的“轻量级分界线”。所谓的“轻量级”是因为多个应用程序域可以存在于单个操作系统进程中。
应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序;能够在不停止整个进程的情况下停止单个应用程序。
进程2321有两个应用程序域。在应用程序域A中,实例化了对象1和2,对象1在程序集1中,对象2在程序集2中。在进程2322中,第二个应用程序域有实例1。实例和静态成员不能在应用程序域之间共享,也不能直接访问另一个应用程序域中的对象。
AppDomain类用于创建和中断应用程序域,加载和卸载程序集。
常用属性和方法:
FriendlyName 取得应用程序域的友好名称
CreateDomain() 创建新的应用程序域。
ExecuteAssembly() 执行应用程序域中的程序集。它可用来执行另一个应用程序域中的代码。
Unload() 执行域的正常卸载。只有应用程序域中正在运行的所有线程都已停止或域中不再有运行的线程之后,才卸载该应用程序域。
创建应用程序域 :
class AppDomain1
{
public static void Main()
{
Console.WriteLine("Creating new AppDomain.");
//创建应用程序域
AppDomain domain = AppDomain.CreateDomain("MyDomain");
//显示当前应用程序域的友好名称
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
//显示新建应用程序域的友好名称
Console.WriteLine("child domain: " + domain.FriendlyName);
}
}
将程序集加载到应用程序域中
1、 程序集代码(生成dll)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary
{
class NewClass
{
public string MyName;
public string MyInfo;
public string myName
{
get { return MyName; }
set { MyName = value; }
}
public string myInfo
{
get { return MyInfo; }
set { MyInfo = value; }
}
public NewClass()
{
MyName = "";
MyInfo = "";
}
public void show()
{
Console.WriteLine(MyName + MyInfo);
}
}
}
2、程序集加载到应用程序域代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace AppDomain3
{
class Program
{
static void Main(string[] args)
{
AppDomain ad = AppDomain.CurrentDomain;
Assembly a = ad.Load("ClassLibrary");
//取得应用程序集中的NewClass类型
Type t = a.GetType("ClassLibrary.NewClass");
//创建NewClass类型的实例
object o = Activator.CreateInstance(t);
//给对象的属性赋值
PropertyInfo p1 = t.GetProperty("myName");
PropertyInfo p2 = t.GetProperty("myInfo");
p1.SetValue(o, "中国", null);
p2.SetValue(o, "China", null);
//调用对象的show方法
MethodInfo mi = t.GetMethod("show");
mi.Invoke(o, null);
}
}
}
参考:
MSDN反射方法类/接口
http://msdn.microsoft.com/zh-cn/library/system.reflection.methodbase.invoke(VS.80).aspx
分享到:
相关推荐
本主题描述应用程序域和程序集之间的关系。您必须首先将一个程序集加载到应用程序域中,然后才能运行该应用程序。运行普通的应用程序会导致将几个程序集加载到一个应用程序域中。默认情况下,公共语言运行库将一个...
3. **模块加载**:应用程序域负责加载和执行程序集,允许在运行时动态加载新的代码或更新现有代码。 4. **故障隔离**:如果一个应用程序域中的代码引发异常,不会影响到其他域,有利于系统的稳定性。 ### 二、动态...
然而,微软并没有提供卸载程序集的方法,原因是因为程序集的卸载会导致应用程序域的不稳定。CLR 产品单元经理 Jason Zander 解释了没有实现该功能的原因。 三、解决卸载程序集的折中方法 为了解决卸载程序集的问题...
动态加载程序集的机制是当C#应用程序在遇到当前应用程序域(AppDomain)里没有的程序集时,会自动搜索与应用程序在同一个目录里的所有程序集,看是否有该程序集,如果没有,则会抛出异常。 动态加载程序集的优点有...
4. 程序集和应用程序域:程序集是.NET代码的物理单元,而应用程序域提供了一种隔离环境,使得不同组件可以在各自的环境中安全运行。 5. 安全模型:理解.NET的安全机制,如权限和角色基础结构,有助于确保应用程序的...
私有程序集通常位于应用程序的本地目录下,只能被当前应用程序域访问。而全局程序集缓存是.NET Framework提供的一种特殊存储区域,用于存放需要跨多个应用程序共享的公共程序集。将程序集放入GAC可以实现多应用间的...
其次,深入学习.NET Framework,包括其类库、对象内存模型、委托、事件、多线程、程序集和应用程序域、安全模型等核心概念。通过开发Windows Form应用程序,可以更好地理解和熟悉.NET Framework。这些知识对后续学习...
了解.NET Framework的类库也至关重要,可以通过开发Windows Form应用来熟悉其基本概念,例如对象内存模型、委托、事件、多线程、程序集和应用程序域以及安全模型。 在具备了面向对象编程的基础后,可以按照以下步骤...
你可以通过开发Windows Form应用来了解.NET Framework的基本结构和类库,包括对象的内存模型、委托、事件、多线程、程序集和应用程序域、安全模型等核心概念。这些知识将直接影响到你对ASP.NET的理解程度。 进入ASP...
6. `AppDomain.GetAssemblies()`返回当前应用程序域(AppDomain)中已加载的所有程序集。 一旦我们有了`Assembly`对象,可以访问它的属性和方法,获取如程序集名称、版本、公钥、导出类型等信息。 接下来,我们...
了解对象的内存模型、委托、事件、多线程、程序集和应用程序域以及安全模型等核心概念。这些都是ASP.NET开发中的重要组成部分。 接下来,具体的学习步骤如下: 1. 学习HTML和CSS:理解HTML的结构和CSS的盒模型,这...
还介绍了两个特别有用的.NET功能:程序集和应用程序域。本书很多章节都会在典型的软件开发项目的不同阶段中使用它们,从而发现每个阶段的弱点并采取相应措施避免受到攻击。 本书在后续章节中系统介绍了.NET安全的...
了解对象内存模型、委托、事件、多线程、程序集和应用程序域、安全模型等核心概念。这些都是ASP.NET开发中不可或缺的知识。 3. **HTML与CSS**:熟悉HTML的结构和CSS的盒模型,理解网页布局的基本原理。掌握div+CSS...
特别关注对象的内存模型、委托、事件、多线程、程序集和应用程序域以及安全模型,这些都是ASP.NET开发的基础。 接下来,学习HTML和CSS,理解网页的基本结构和样式规则。这对于创建ASP.NET页面至关重要,因为ASP.NET...
首先,你需要了解.NET Framework的基础,包括对象的内存模型、委托、事件、多线程、程序集和应用程序域以及安全模型。这些都是ASP.NET运行的基础,深入理解它们能够帮助你更好地开发和调试应用。 接下来,学习HTML...
学习如何组织和分层你的代码,利用程序集和应用程序域的概念。 9. **设计模式和架构**:虽然不必强迫自己学习所有设计模式,但理解一些核心模式会有助于提高代码质量和可维护性。在实践中,灵活运用设计模式,根据...
学习.NET Framework类库也很关键,包括对象内存模型、委托、事件、多线程、程序集和应用程序域、安全模型等。熟悉这些概念能帮助你更好地理解ASP.NET的工作原理。 接着,深入学习HTML和CSS,理解HTML的结构和CSS的...
第二步,了解.NET Framework的核心概念,如对象的内存模型、委托、事件、多线程、程序集和应用程序域,以及安全模型。这些都是ASP.NET开发中不可或缺的部分。通过开发Windows Form应用程序,可以加深对.NET ...
通过正确地创建和管理应用程序域,可以安全地执行外部代码,并将其窗口集成到主应用程序中,同时保持代码的隔离性和安全性。在实际开发中,还需要考虑错误处理、日志记录等细节,以确保系统的稳定运行。