2010-09-25 90 views
2

AFAIK,那里是3种方法的组件加载到应用程序域:为什么我们有这么多种装配加载方法?

  • Assembly.Load()
  • Assembly.LoadFrom()
  • Assembly.LoadFile()

的LoadFrom()方法将组件文件路径作为其参数,但文件路径仅提供所述组件的身份信息为线索对CLR。 LoadFrom()方法仍使用该身份信息在内部调用Load()。所以LoadFrom(filepath)很可能会加载一个与filepath指定的程序集完全不同的程序集。但驯服的LoadFile()方法将只加载我们指定的程序集。

我想知道为什么我们需要LoadFrom()方法?它只增加了混淆和陷阱。有什么情况只有LoadFrom()适用?

非常感谢。

回答

0

这是相当隐蔽,并没有直接点名,但Assembly.LoadFrom负载从URI装配的,所以您可以指定非本地路径;而Assembly.Load只在本地加载。

这是在备注到LoadFrom

的assemblyFile参数,必须是一个URI没有转义字符。此方法为URI中的所有无效字符提供转义字符。

msdn

2

实际上有很多关于这个讨论中,一些不同的意见:

Difference between LoadFile and LoadFrom with .NET Assemblies?

http://geekswithblogs.net/rupreet/archive/2010/02/16/137988.aspx

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/3bdaf65c-520c-4a1a-a825-fc2ca2957bf3

http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx

要回答你关于为什么需要LoadFrom()方法的问题。那么,它似乎归结为想要从一个特定的位置和依赖关系加载。 load()方法解决依赖,但不会允许您选择组件的位置(即有一组“探测”在哪里组装试图结构被发现)。的LoadFile()保证你会加载指定为字符串参数的组装,但不解决依赖关系。 LoadFrom()并不能保证你在路径提供组件将被加载(即,如果有类似的身份组件已经装入),但它确实解决依赖你。

从MSDN

使用的LoadFile方法来加载和 检查具有相同 身份组件,但位于不同的 路径。与LoadFrom方法 一样,LoadFile不会将文件 加载到LoadFrom上下文中,并且 不会使用加载路径 解决依存关系。 LoadFile在此限制场景中很有用,因为LoadFrom 不能用于加载具有相同身份但不同 路径的程序集;它只会加载第一个这样的组件。

从我所收集的,不稳定的共识似乎形成一个应该的LoadFile(远离),使用load()如果,如果你需要,你可以使用LoadFrom()。但是我看到有人说远离LoadFrom()。

作为一个数据点,在Ecma CLI标准(http://www.ecma-international.org/publications/standards/Ecma-335.htm)中,我们只对Assembly.Load(string)方法进行了标准化,其中字符串是程序集名称。

2

你应该总是使用Assembly.Load()。只有这种方法才能保证可预测的结果。它避免了DLL地狱,并确保程序集只加载一次,即使代码加载多次。

如果您想故意破坏规则,则需要另外两个。如果要加载不在正常探测路径中的程序集,则使用LoadFrom()。例如,当它们存储在不同的目录中时,插件很常见。装入预期的程序集时您将没有任何问题,但您通常在之后对它所依赖的程序集有问题。

LoadFile()可以做到这一点,但也打破了“不要加载一次以上”的规则。这是你想要的,这是非常非常罕见的。仅在需要加载具有相同标识但存储在不同路径中的程序集副本的情况下才有用。例如,某种工具可以转储程序集元数据。在所有其他情况下避免它,它只会导致痛苦。从这样的程序集加载的类型永远不能与从程序集的另一个副本加载的完全相同的类型兼容。即使是相同的副本。