猿问

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

我一直在看msdn文档,但是对于使用LoadFileLoadFrom加载程序集之间的区别到底还是有些困惑。有人可以提供示例或类比来更好地描述它吗?MSDN文档使我更加困惑。此外,ReflectionOnlyLoadFrom与相同,LoadFrom只是它仅以反射模式加载装配件。

由于我的.NET经验不是最好的,因此有一些有关使用LoadFile的MSDN文档的问题:

1)LoadFile检查具有相同标识但位于不同路径的程序集是什么意思?身份是什么(示例)?

2)它声明LoadFile不将文件加载到“ LoadFrom Context”中,并且不使用加载路径解析依赖项。这是什么意思,有人可以提供例子吗?

3)最后,它指出LoadFile在这种有限的情况下很有用,因为LoadFrom无法加载具有相同标识但路径不同的程序集;它只会加载第一个这样的程序集,这又使我想到一个问题,程序集的身份是什么?


慕妹3242003
浏览 731回答 3
3回答

30秒到达战场

这样可以清除吗?// 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 trueConsole.WriteLine(assembly1.CodeBase == assembly2.CodeBase);assembly1 = Assembly.LoadFile(path1);assembly2 = Assembly.LoadFile(path2);// These point to different assemblies now, so this is falseConsole.WriteLine(assembly1.CodeBase == assembly2.CodeBase);编辑:要回答您在修订后的问题中提出的问题,您肯定想阅读Suzanne Cook的Assembly Identity。有很多规则控制程序集的加载方式,其中一些规则与如何解决依赖关系有关-如果您的AssemblyA依赖于AssemblyB,那么.NET在哪里可以找到AssemblyB?在全局程序集缓存中,它找到了AssemblyA所在的目录,还是完全位于其他位置?此外,如果找到该程序集的多个副本,应如何选择要使用的那个副本?LoadFrom有一套规则,而LoadFile有另一套规则。很难想象有很多使用原因LoadFile,但是如果您需要在同一程序集的不同副本上使用反射,那么反射就在那里。

慕妹3146593

来自Suzanne Cook的博客:LoadFile与LoadFrom小心-这些不是同一回事。LoadFrom()通过Fusion,可以重定向到其他路径下的另一个程序集,但如果已经在LoadFrom上下文中加载了同一组件,则具有相同的标识。LoadFile()根本不通过Fusion进行绑定-加载程序仅继续进行并完全加载*调用者请求的内容。它不使用Load或LoadFrom上下文。因此,LoadFrom()通常会为您提供所需的内容,但不一定如此。LoadFile()适用于那些真的非常想要确切的请求的人。(*但是,从v2开始,策略将同时应用于LoadFrom()和LoadFile(),因此LoadFile()不一定完全符合要求。此外,从v2开始,如果具有其标识的程序集位于GAC,将改用GAC副本。请使用ReflectionOnlyLoadFrom()完全加载所需的内容-但是请注意,无法执行以这种方式加载的程序集。)LoadFile()有一个陷阱。由于它不使用绑定上下文,因此不会在其目录中自动找到其依赖项。如果它们在Load上下文中不可用,则必须订阅AssemblyResolve事件才能绑定到它们。

肥皂起泡泡

经过反复的努力,今天下午我自己发现了一个不同之处。我想在运行时加载一个DLL,并且该DLL位于另一个目录中。该DLL具有自己的依赖项(DLL),这些依赖项也位于同一目录中。LoadFile():加载特定的DLL,但不加载依赖项。因此,当第一次从DLL内部调用到其他DLL中的一个时,它引发了FileNotFoundException。LoadFrom():加载我指定的DLL以及该目录中存在的所有依赖项。
随时随地看视频慕课网APP
我要回答