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.dll在c:\temp\a.dll。 现在当前AppDomain的AppBase是c:\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有个一致的行为。第一次成功了,以后就会成功。第一次失败了,以后就会失败。
当然最根本的原因是为了共享。没有这个保证的话共享是不可能的。