Gotdotnet.com 上发表的break changes from version 1.1 to 2.0 上有一条:

 

Cache load failures in order to ensure that different app domains do not have different dependency loading success/failure characteristics in domain neutral sharing scenarios

 

http://www.gotdotnet.com/team/changeinfo/Backwards1.1to2.0/default.aspx#00000067

 

link里有说明这是怎么回事。简单的说,在同一个AppDomain里,如果 Assembly.Load/Assembly.LoadFrom()第一次失败了的话,以后同一个Assembly.Load()/Assembly.LoadFrom()会继续失败,并且会返回同一个exception,即使你在第一次和第二次之间把assembly拷到正确的地方。

 

举个例子。假设a.dllc:\temp\a.dll 现在当前AppDomainAppBasec:\myapp.

 

Assembly.Load(“A, version=0.0.0.0, culture=neutral, publickeytoken=0123456789abcde”眨眼笑脸;  // will fail with FileNotFoundException since a.dll is not in c:\myapp;

File.Copy(“c:\\temp\\a.dll”, “c:\\myapp\a.dll”眨眼笑脸;

Assembly.Load(“A, version=0.0.0.0, culture=neutral, publickeytoken=0123456789abcde”眨眼笑脸;  // this will succeed in 1.0/1.1, but will fail in 2.0, since in 2.0 the binding failure of the first bind is cached.

 

这个改变的原因是让assembly binding in one AppDomain有个一致的行为。第一次成功了,以后就会成功。第一次失败了,以后就会失败。

 

当然最根本的原因是为了共享。没有这个保证的话共享是不可能的。