首先建立一个共享程序集,代码如下:
namespace PublicAssembly
{
public class PublicClass
{
public static int Num=0;
public static int Add(int i) { Num += i; return Num; }
public static int Reduce(int i) { Num -= i; return Num; }
}
}
建立密钥对,强命后,安装共享程序集 成功后。
使用VS2010建立一个控制台应用程序ConsoleApplication1,添加应用共享程序集。
再使用VS2010新建一个控制台应用程序ConsoleApplication2,添加共享程序集,在该控制台应用程序中,新建一个类:
using PublicAssembly;
namespace ConsoleApplication2
{ public class Person:MarshalByRefObject
{
public void Show()
{
Console.WriteLine(PublicClass.Num);
}
};
}
然后在控制台程序ConsoleApplication1,编写如下代码:
using PublicAssembly;
using ConsoleApplication2;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
PublicClass pc = new PublicClass();
PublicClass.Num = 100;
Console.WriteLine(PublicClass.Num); AppDomain ap = AppDomain.CreateDomain("Domain1");
Person wang = (Person)ap.CreateInstanceAndUnwrap("ConsoleApplication2"
, "ConsoleApplication2.Person");
wang.Show();
Console.ReadKey();
}
};
}
结果是:
100
0
为什么是这样呢,不是说共享程序集在内存中就只有一份副本吗,为什么结果是不一样的数值呢?
namespace PublicAssembly
{
public class PublicClass
{
public static int Num=0;
public static int Add(int i) { Num += i; return Num; }
public static int Reduce(int i) { Num -= i; return Num; }
}
}
建立密钥对,强命后,安装共享程序集 成功后。
使用VS2010建立一个控制台应用程序ConsoleApplication1,添加应用共享程序集。
再使用VS2010新建一个控制台应用程序ConsoleApplication2,添加共享程序集,在该控制台应用程序中,新建一个类:
using PublicAssembly;
namespace ConsoleApplication2
{ public class Person:MarshalByRefObject
{
public void Show()
{
Console.WriteLine(PublicClass.Num);
}
};
}
然后在控制台程序ConsoleApplication1,编写如下代码:
using PublicAssembly;
using ConsoleApplication2;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
PublicClass pc = new PublicClass();
PublicClass.Num = 100;
Console.WriteLine(PublicClass.Num); AppDomain ap = AppDomain.CreateDomain("Domain1");
Person wang = (Person)ap.CreateInstanceAndUnwrap("ConsoleApplication2"
, "ConsoleApplication2.Person");
wang.Show();
Console.ReadKey();
}
};
}
结果是:
100
0
为什么是这样呢,不是说共享程序集在内存中就只有一份副本吗,为什么结果是不一样的数值呢?
你的试验不是证明了GAC下的程序集也会被加载到不同的AppDomain下?我所知道的是mscorlib.dll等系统dll,出于性能考虑,会在AppDomain间共享。
2、不同的CLR宿主可以选择不同的装载方式(比如asp.net选择共享强命名程序集)。
3、即使在不同AppDomain间共享程序集,对于静态成员,不同的AppDomain将维持不同的版本。有兴趣可以阅读前微软CLR Team成员cbrumme的文章:
AppDomains ("application domains")以及JunFeng Zhang的博文:
Domain Neutral Assemblies