LoadFile和LoadFrom与.NET程序集之间的区别?

我在看MSDN文档,我仍然有点困惑什么是加载程序集时使用LoadFileLoadFrom之间的区别。 有人可以提供一个例子或比喻来更好地描述它。 MSDN文档更让我困惑。 此外, ReflectionOnlyLoadFromLoadFrom相同,只是它仅在reflection模式下加载程序集。

由于我的.NET经验并不是最大的,所以下面是关于使用LoadFile的MSDN文档的一些问题:

1)什么是由LoadFile检查具有相同的身份,但位于不同的path的程序集? 什么是身份(例子)?

2)它声明LoadFile不会将文件加载到“LoadFrom Context”中,也不会使用加载path来parsing依赖关系。 这是什么意思,有人能提供一个例子吗?

3)最后,它声明LoadFile在这个有限的场景中很有用,因为LoadFrom不能加载具有相同身份但不同path的程序集; 它只会加载第一个这样的程序集,这再次引起我同样的问题,程序集标识是什么?

这是否清除它?

 // path1 and path2 point to different copies of the same assembly on disk: Assembly assembly1 = Assembly.LoadFrom(path1); Assembly assembly2 = Assembly.LoadFrom(path2); // These both point to the assembly from path1, so this is true Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase); assembly1 = Assembly.LoadFile(path1); assembly2 = Assembly.LoadFile(path2); // These point to different assemblies now, so this is false Console.WriteLine(assembly1.CodeBase == assembly2.CodeBase); 

编辑 :为了回答你在修改后的问题中提出的问题,你一定要阅读Suzanne Cook的“Assembly Identity” 。

有很多规则来控制程序集的加载方式,其中一些规则与他们如何解决依赖关系有关 – 如果你的AssemblyA依赖于AssemblyB,.NET应该在哪里findAssemblyB? 在全局程序集caching中,findAssemblyA的相同目录,还是完全在其他地方? 而且,如果它find了该组件的多个副本,应该如何select使用哪一个?

LoadFrom有一组规则,而LoadFile有另一组规则。 很难想象使用LoadFile许多理由,但是如果您需要在同一个程序集的不同副本上使用reflection,那么它就在您的面前。

来自Suzanne Cook的博客 :

LoadFile与LoadFrom

小心 – 这些不是一回事。

LoadFrom()通过Fusion,并且可以被redirect到另一个path上的另一个程序集,但是如果已经在LoadFrom上下文中载入了相同的标识。

LoadFile()根本不通过Fusion进行绑定 – 加载器会继续,并且正好加载*调用者请求的内容。 它不使用Load或LoadFrom上下文。

所以,LoadFrom()通常给你你所要求的,但不一定。 LoadFile()适用于真正需要的人。 (*但是,从v2开始,策略将同时应用于LoadFrom()和LoadFile(),所以LoadFile()不一定就是要求的。另外,从v2开始,如果一个具有其身份的程序集GAC,GAC副本将被使用。使用ReflectionOnlyLoadFrom()来加载你想要的东西 – 但是,请注意,以这种方式加载的程序集不能被执行。)

LoadFile()有一个catch。 由于它不使用绑定上下文,因此其相关性不会自动在其目录中find。 如果它们在Load上下文中不可用,则必须订阅AssemblyResolve事件才能绑定到它们。

看到这里 。

另请参阅在同一博客上select“绑定上下文”文章。

今天下午我经历了很多头痛之后发现了一个不同的地方。

我想在运行时加载一个DLL,并且DLL住在另一个目录中。 该DLL有自己的依赖关系(DLL),也居住在同一目录。

LoadFile():加载特定的DLL,但不是依赖项。 所以当第一次调用是从DLL内部到其他DLL中的一个时,它抛出了一个FileNotFoundExceptionexception。

LoadFrom():加载了我指定的DLL以及所有在那个目录中的依赖。

我注意到的一个区别是:

Assembly.LoadFile – 使用有限的用户权限在不同的AppDomain中加载程序集(diffrence principel)。 像血pipe凝固/凝血作用这样的手术是无法执行的。

Assembly.LoadFrom – 以相同的用户权限(相同原则)在同一AppDomain中加载程序集。

注意:如果一个程序集使用8.3path加载,然后从非8.3path加载,则它们将被视为不同的程序集,即使它们是相同的物理DLL。

.NET有不同的负载上下文。 Suzanne Cook在这里写了关于他们: http : //blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

这是.Net隔离区的引用没有混淆。

就我而言,我只需简单地删除位于@ C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files的ASP应用程序caching。 当网站首次运行时,它会被重build。 一定要先停止IIS。

希望这可以帮助像我这样的人。

据文件记载:

LoadFile(String):加载给定文件path的程序集文件的内容。

LoadFrom(String):根据文件名或path加载程序集。