理解应用程序域:
应用程序域是.NET 运行库的逻辑进程表示,操作系统进程可以包含多个应用程序域。应用程序域具有下列优点:
1、隐藏了进程具体的操作系统信息。从而允许把.NET 放在不同的操作系统下。
2、提供了隔离。即使运行在同一个进程中的属于不同域的应用程序也不能直接共享全局数据、静态数据或其他资源。所以,一个应用程序域失败了,也不会影响到同一个进程中的其他应用程序域。
3、对于不需要昂贵的 IPC 机制的进程,应用程序域允许 .NET 运行库优化运行在这种进程中的应用程序间的通信。
因为应用程序域是被隔离的,所有.NET 对象都会被界定在创建它的应用程序域内。如果跨应用程序域的边界传递对象引用,该被引用对象就被称为远程对象。
例程:如何进行应用程序域的交替,那么必然要构造两个应用程序域:
1、新建一个控制台应用程序,项目名称为:RemotingTest,vs.net 2003 会在 RemotingTest 解决方案下生成一个 RemotingTest项目。
2、下面,我们来构建另一个应用程序域,该应用程序引用一个简单计算的类库 MathLibrary ,右键单击解决方案,添加——新建项目——类库,数据类库的名字为 MathLibrary,完成。将Class1改名为 SimpelMath,代码如下:
using System;
namespace MathLibrary
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class SimpleMath
{
public static int Add(int n1,int n2)
{
return n1 + n2;
}
public static int Subtract(int n1,int n2)
{
return n1 - n2;
}
}
}
选择“生成”菜单下面的生成 MathLibrary,完成了对类库的编译。右键单击解决方案,添加——新建项目——控制台应用程序,命名为 MathClient,代码如下:
using System;
using MathLibrary;
namespace MathClient
{
/// <summary>
/// MathClient 的摘要说明。
/// </summary>
public class MathClient
{
static void Main(string[] args)
{
Console.WriteLine();
AppDomain myDomain = AppDomain.CurrentDomain;
Console.WriteLine("Info about our current app domain");
Console.WriteLine("Hash Code = {0}",myDomain.GetHashCode());
Console.WriteLine("Friendly Name = {0}",myDomain.FriendlyName);
Console.WriteLine("App Base = {0}",myDomain.BaseDirectory);
Console.WriteLine();
Console.WriteLine(" 5 + 3 = {0} ",SimpleMath.Add(5,3));
Console.WriteLine(" 5 - 3 = {0} ",SimpleMath.Subtract(5,3));
Console.ReadLine();
}
}
}
注意:一定要添加对 MathLibrary 类库的引用,这样,一个使用类库的应用程序域就建立好了。
3、修改RemotingTest项目下的 Class1.cs 为 RemotingTest.cs,修改后代码如下:
using System;
namespace RemotingTest
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class RemotingTest
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
AppDomain myDomain = AppDomain.CurrentDomain;
Console.WriteLine("Info about our current app domain");
Console.WriteLine("Hash Code = {0}",myDomain.GetHashCode());
Console.WriteLine("Friendly Name = {0}",myDomain.FriendlyName);
Console.WriteLine("App Base = {0}",myDomain.BaseDirectory);
Console.WriteLine("Probing paths = {0}",myDomain.RelativeSearchPath);
AppDomain mathDomain = AppDomain.CreateDomain("MathClient");
mathDomain.ExecuteAssembly(@"E:\Csharp\MathClient\bin\Debug\MathClient.exe");
}
}
}
注意:一定要注意应用程序域的路径是正确的。
运行结果如下: