应用程序域操作 代码解析

应用程序域操作(AppDomain) 代码解析

1.应用程序域AppDomain操作

代码
/*编写者:吴蒋
时间:2010-05-11
修改者:
修改内容:
*/

using System;
using System.Threading;
using System.Runtime.Remoting;

namespace ApplicationDomain
{
class Program
{
static void Main(string[] args)
{
//获得当前应用程序域
AppDomain currentAppDomain = AppDomain.CurrentDomain;
//获得当前线程的应用程序域
AppDomain currentTDomain = Thread.GetDomain();

//分别输出域名
Console.WriteLine("当前应用程序域{0}",currentAppDomain.FriendlyName);
Console.WriteLine(
"当前线程应用程序域{0}" , currentTDomain.FriendlyName);
Console.ReadKey();

AppDomain newDomain
= AppDomain.CreateDomain("NewDomain");
//判断是否是同一应用程序域
Console.WriteLine("newDomain对象是否是同一应用程序域{0}", newDomain.IsDefaultAppDomain() ==true ?"":"不是");
Console.ReadKey();
}
}
}

 

AppDomain类是一个应用程序域封装的类,提供一些域的操作比如加载程序集、创建对象、创建应用程序域等等。

 

代码
/*编写者:吴蒋
时间:2010-05-11
修改者:
修改内容:
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace ApplicationDomain1
{
class Program
{
static void Main(string[] args)
{
Test();
}

public static void Test()
{
//获得当前域对象
AppDomain ap = AppDomain.CurrentDomain;
//输出名称
Console.WriteLine(ap.FriendlyName);

//实例化对象
TestClass tc;
tc
= (TestClass)ap.CreateInstanceAndUnwrap("ApplicationDomain1", "ApplicationDomain1.TestClass");
//显示当前域名
tc.ShowAppDomain();
//调用3次当前域中类的方法
tc.FunctionTest("Jason");
tc.FunctionTest(
"Jason");
tc.FunctionTest(
"Jason");
tc.FunctionTest(
"Jason");
Console.ReadKey();

}
}

class TestClass
{
//计数器
int count = 0;

/// <summary>
/// 计数方法
/// </summary>
/// <param name="name"></param>
public void FunctionTest(string name)
{
count
++;
Console.WriteLine(
"{1}触发了:{0}次", count, name);
}


/// <summary>
/// 显示当前域名
/// </summary>
public void ShowAppDomain()
{
AppDomain currentDomain
= AppDomain.CurrentDomain;
Console.WriteLine(currentDomain.FriendlyName);
}

}

}

 

 输出结果:

 

 

下面来一组会报错的代码 我不用当前的应用程序域 新建一个域然后加载类

 

代码
static void Main(string[] args)
{
try
{
Test2();
}
catch (Exception ex)
{

Console.WriteLine(ex.Message);
Console.ReadKey();
}


}


public static void Test2()
{
//获得当前域对象
AppDomain ap = AppDomain.CurrentDomain;
//输出名称
Console.WriteLine(ap.FriendlyName);

// 创建一个新的应用程序域 - NewDomain
AppDomain newDomain = AppDomain.CreateDomain("NewDomain");



TestClass tc;
// 在新的应用程序域中创建对象
tc = (TestClass)newDomain.CreateInstanceAndUnwrap("ApplicationDomain1", "ApplicationDomain1.TestClass");
//显示当前域名
tc.ShowAppDomain();


//调用3次当前域中类的方法
tc.FunctionTest("Jason");
tc.FunctionTest(
"Jason");
tc.FunctionTest(
"Jason");
tc.FunctionTest(
"Jason");
Console.ReadKey();

}

输出错误为:未标记为可序列化,想想为什么发生这个异常  AppDomain ap = AppDomain.CurrentDomain;我们是在当前的应用程序域里面即ApplicationDomain1.exe中声明,然后继续忘下看  AppDomain newDomain = AppDomain.CreateDomain("NewDomain");创建了个新的应用程序域。那会出现一个什么问题,对象的引用 TestClass tc;在当前的应用程序域里而 tc = (TestClass)newDomain.CreateInstanceAndUnwrap("ApplicationDomain1", "ApplicationDomain1.TestClass");对象的本身却在新的应用程序域里而AppDomain是彼此隔离的所以就抛出了异常。那如何解决异常已经说的很明白只要在

 class TestClass标识为可序列化[Serializable]就行了。

 

 先在远程创建对象,接着将对象序列化,然后传递对象,在本地进行反序列化,最后还原对象。当我们将对象标记为可序列化时,然后进行上面的操作时,对象本身已经由另一应用程序域(远程)传递到了本地应用程序域中。

posted @ 2010-05-11 13:30  吴蒋  阅读(546)  评论(0编辑  收藏  举报