首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NET程序集的LoadFile和LoadFrom之间的区别?

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

Stack Overflow用户
提问于 2009-09-25 23:03:39
回答 7查看 57.1K关注 0票数 138

我正在看msdn文档,我仍然对加载程序集时使用LoadFileLoadFrom的确切区别感到有点困惑。有人能提供一个例子或类比来更好地描述它吗?MSDN文档更让我困惑。此外,除了仅在反射模式下加载程序集之外,ReflectionOnlyLoadFromLoadFrom相同。

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

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

2)它声明LoadFile不会将文件加载到“LoadFrom Context”中,也不会使用加载路径解析依赖项。这是什么意思,有人能举个例子吗?

3)最后,它指出LoadFile在这个有限的场景中很有用,因为LoadFrom不能加载具有相同标识但不同路径的程序集;它只会加载第一个这样的程序集,这又给我带来了同样的问题,程序集标识是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-25 23:13:31

这样做清楚了吗?

代码语言:javascript
复制
// 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 on Assembly Identity

有很多规则控制如何加载程序集,其中一些规则与它们如何解决依赖关系有关-如果您的AssemblyA依赖于AssemblyB,那么.NET应该在哪里寻找AssemblyB?在全局程序集缓存中,是找到AssemblyA的同一目录,还是完全在其他地方?此外,如果它找到该程序集的多个副本,它应该如何选择要使用的副本?

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

票数 99
EN

Stack Overflow用户

发布于 2009-09-25 15:13:35

来自Suzanne Cook's blog

LoadFile与LoadFrom

要小心--这不是一回事。

LoadFrom()通过Fusion,可以被重定向到位于不同路径但具有相同标识的另一个程序集,前提是已经在LoadFrom上下文中加载了该程序集。

LoadFile()根本不会通过Fusion进行绑定--加载器只会继续加载调用者所请求的内容。它既不使用Load上下文,也不使用LoadFrom上下文。

因此,LoadFrom()通常会满足您的要求,但不是必须的。LoadFile()是为那些真正想要所请求的东西的人准备的。(*然而,从v2开始,策略将同时应用于LoadFrom()和LoadFile(),因此LoadFile()不一定与所请求的完全相同。此外,从v2开始,如果具有其标识的程序集在GAC中,则将使用GAC副本。使用ReflectionOnlyLoadFrom()加载您想要的内容-但是,请注意,以这种方式加载的程序集不能执行。)

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

参见here

另请参阅同一博客上的Choosing a Binding Context文章。

票数 63
EN

Stack Overflow用户

发布于 2013-02-26 23:32:28

在经历了许多挠头之后,今天下午我自己发现了一个不同之处。

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

LoadFile():加载了特定的DLL,但未加载依赖项。因此,当第一次从DLL内调用其他某个DLL时,它会抛出一个FileNotFoundException。

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

票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1477843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档