动态装配加载,内存问题

时间:2014-03-26 10:31:31

标签: c# .net dll .net-assembly

我可能需要多次动态加载相同的程序集。我的问题是:

  1. 程序集实际只会加载一次或多次吗?程序集本身是一个DLL建议第一个选项,但谁知道:)。
  2. 我有一种经验,从同一个程序集实例化的相同类型,但是从两个不同的地方动态加载是不兼容的。从同一个地方加载这个组件两次也是这种情况吗?

2 个答案:

答案 0 :(得分:4)

这取决于程序集加载的加载上下文。 Suzanne Cook的博客在SO答案中难以解释这个一百美元的单词,详细介绍了这个概念。简而言之,上下文允许CLR确定程序集是否在它应该查找依赖程序集之前和之处加载。

更容易解释可能出现的问题。 Assembly.LoadFile()Assembly.Load(byte[])都加载没有上下文的程序集。由于CLR无法确定之前加载的组件是否已加载,因此可以多次加载组件。对于LoadFile(),这是故意,在非常精选的情况下,您希望允许再次加载程序集。对于Load(byte [])来说,这是不可避免的事故,CLR对组件的身份知之甚少,因为它无法知道它的显示名称。

这几乎总是,.NET中的类型具有不仅仅是命名空间名称+类型名称的标识,它还包括从中加载类型的程序集。您往往难以诊断InvalidCastExceptions,其类似于"无法将类型为Foo.Bar的对象转换为Foo.Bar"。这导致头发丛在试图弄清楚这意味着什么以及是什么原因导致头发丢失。

注意Assembly.LoadFile(),它的名字看起来太无辜了,它很少做你想做的事情。请改用LoadFrom()。加载(byte [])同样危险,并且是适当安装程序的替代品。

答案 1 :(得分:1)

您无法多次将同一个程序集加载到同一个应用程序域中,除非程序集已更改,否则它也没有多大意义。

如果您确实想要重复加载程序集,则需要将其加载到其他appdomain中,然后卸载appdomain以卸载程序集。原因是没有明确的方法来卸载程序集,只有一个appdomain。