为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3242003 2019-10-09 15:13:50
我一直在看msdn文档,但是对于使用LoadFile和LoadFrom加载程序集之间的区别到底还是有些困惑。有人可以提供示例或类比来更好地描述它吗?MSDN文档使我更加困惑。此外,ReflectionOnlyLoadFrom与相同,LoadFrom只是它仅以反射模式加载装配件。由于我的.NET经验不是最好的,因此有一些有关使用LoadFile的MSDN文档的问题:1)LoadFile检查具有相同标识但位于不同路径的程序集是什么意思?身份是什么(示例)?2)它声明LoadFile不将文件加载到“ LoadFrom Context”中,并且不使用加载路径解析依赖项。这是什么意思,有人可以提供例子吗?3)最后,它指出LoadFile在这种有限的情况下很有用,因为LoadFrom无法加载具有相同标识但路径不同的程序集;它只会加载第一个这样的程序集,这又使我想到一个问题,程序集的身份是什么?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这样可以清除吗?


// 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在哪里可以找到AssemblyB?在全局程序集缓存中,它找到了AssemblyA所在的目录,还是完全位于其他位置?此外,如果找到该程序集的多个副本,应如何选择要使用的那个副本?


LoadFrom有一套规则,而LoadFile有另一套规则。很难想象有很多使用原因LoadFile,但是如果您需要在同一程序集的不同副本上使用反射,那么反射就在那里。


查看完整回答
反对 回复 2019-10-09
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

来自Suzanne Cook的博客:


LoadFile与LoadFrom


小心-这些不是同一回事。


LoadFrom()通过Fusion,可以重定向到其他路径下的另一个程序集,但如果已经在LoadFrom上下文中加载了同一组件,则具有相同的标识。


LoadFile()根本不通过Fusion进行绑定-加载程序仅继续进行并完全加载*调用者请求的内容。它不使用Load或LoadFrom上下文。


因此,LoadFrom()通常会为您提供所需的内容,但不一定如此。LoadFile()适用于那些真的非常想要确切的请求的人。(*但是,从v2开始,策略将同时应用于LoadFrom()和LoadFile(),因此LoadFile()不一定完全符合要求。此外,从v2开始,如果具有其标识的程序集位于GAC,将改用GAC副本。请使用ReflectionOnlyLoadFrom()完全加载所需的内容-但是请注意,无法执行以这种方式加载的程序集。)


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


查看完整回答
反对 回复 2019-10-09
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

经过反复的努力,今天下午我自己发现了一个不同之处。

我想在运行时加载一个DLL,并且该DLL位于另一个目录中。该DLL具有自己的依赖项(DLL),这些依赖项也位于同一目录中。

LoadFile():加载特定的DLL,但不加载依赖项。因此,当第一次从DLL内部调用到其他DLL中的一个时,它引发了FileNotFoundException。

LoadFrom():加载我指定的DLL以及该目录中存在的所有依赖项。


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 730 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信