我一直在寻找在MSDN文档,我仍对到底什么是两者的区别有点困惑LoadFile
和LoadFrom
加载部件时。 有人可以提供一个例子或比喻来更好地描述它。 MSDN文档弄得我更多。 而且, ReflectionOnlyLoadFrom
一样LoadFrom
不同之处在于它加载组件仅在反射模式。
由于我的.NET的经验是不是最大的,这里有关于使用的LoadFile MSDN文档的一些问题:
1)这是什么意思LoadFile
检查具有相同身份组件,但位于不同的路径? 什么是身份(例如)?
2)规定了LoadFile
不会将文件加载到“LoadFrom上下文”并不能解决使用负载路径依赖。 这是什么意思,有人可以提供一个例子吗?
3)最后,它指出LoadFile
因为LoadFrom无法加载具有相同身份但不同的路径组件是在这有限的场景中有用; 它只会加载第一个这样的组装,这又使我同样的问题,什么是组件的身份?
这是否清除它呢?
// 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);
编辑 :回答你在经修订的课题提出的问题,你一定要读对大会的身份苏珊娜·库克 。
有很多的支配组件加载方式的规则,其中一些与他们如何解决依赖关系做 - 如果你的AssemblyA取决于AssemblyB,应该在哪里.NET去找找AssemblyB? 在全局程序集缓存,同一个目录就发现AssemblyA,或其他地方完全? 此外,如果发现该组件的多个副本,究竟应该如何选择使用哪一个?
LoadFrom
都有一套规则,而LoadFile
有另一套规则。 这是很难想象的原因有很多使用LoadFile
,但如果你需要在同一个组件的不同拷贝使用反射,它的存在给你的。
从苏珊·库克的博客 :
主场迎战的LoadFile LoadFrom
要小心 - 这些都是不一样的东西。
LoadFrom()经过融合,并且如果一个在LoadFrom上下文已经加载可在不同的路径,但与相同的标识重定向到另一组件。
的LoadFile()不通过融合在所有绑定 - 装载机只是继续运行并装入准确*来电者要求什么。 它不使用任何负载或LoadFrom上下文。
所以,LoadFrom()通常给你你问什么,但不一定。 的LoadFile()是为那些谁真的,真的想到底是什么要求。 (*但是,在V2开始,政策将应用到LoadFrom()和的LoadFile(),这样的LoadFile()不一定会确切地被要求什么。此外,在V2开始,如果其身份的组件在海关总署,海关总署副本将被用来代替使用ReflectionOnlyLoadFrom()来加载你想要什么 - 。但是,请注意,组件加载不能执行的方式)
的LoadFile()有一个陷阱。 由于它不使用绑定上下文,它的依赖不会自动在目录中找到。 如果他们不是在负载情况下可用,你就必须订阅AssemblyResolve事件以绑定到他们。
见这里 。
另请参阅选择一个绑定上下文在同一博客文章。
很多头刮后我发现一个区别自己这个下午。
我想在运行时加载DLL,以及DLL住在另一个目录。 该DLL有它自己的依赖(DLL)中,其也住在同一个目录。
的LoadFile():加载特定DLL,但不是依赖。 因此,当第一个电话是从DLL中作出的其他DLL的一个扔一个FileNotFoundException异常。
LoadFrom():加载我指定的DLL,并全部住在该目录中的依赖关系。
一个区别,我注意到的是:
Assembly.LoadFile -加载组件在不同的应用程序域具有有限的用户权限(diffrence principel)。 像serilization / deserilization操作无法进行。
Assembly.LoadFrom -加载组件,其与相同的用户权限(相同principel)相同的AppDomain。
注意:如果一个组件被使用8.3路径加载,然后从非8.3的路径,它们将即使它们是相同的物理DLL被看作是不同的组件,。
.NET具有不同的负载情况下。 苏珊·库克写了关于他们在这里: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx
这是净隔离引用不混合起来的方式。
就我而言,我只是简单地删除位于@ ASP应用程序缓存C:\Windows\Microsoft.NET\Framework\[asp version]\Temporary ASP.NET Files
。 当该网站是第一次运行它被重建。 请务必先停止IIS。
希望这可以帮助别人喜欢它为我做的。