3 回答
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,但是如果您需要在同一程序集的不同副本上使用反射,那么反射就在那里。
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事件才能绑定到它们。
TA贡献1829条经验 获得超6个赞
经过反复的努力,今天下午我自己发现了一个不同之处。
我想在运行时加载一个DLL,并且该DLL位于另一个目录中。该DLL具有自己的依赖项(DLL),这些依赖项也位于同一目录中。
LoadFile():加载特定的DLL,但不加载依赖项。因此,当第一次从DLL内部调用到其他DLL中的一个时,它引发了FileNotFoundException。
LoadFrom():加载我指定的DLL以及该目录中存在的所有依赖项。
- 3 回答
- 0 关注
- 730 浏览
添加回答
举报