Assembly.Load(byte [])如何工作?

时间:2011-11-29 22:42:45

标签: c# model-view-controller plugins .net-assembly

我只是想知道如果我要在网络应用中加载两次相同的汇编字节会发生什么。

例如我有这段代码

byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");

var loadedAssem = Assembly.Load(assem);

var plugin = loadedAssem.CreateInstance("Plugin.ThePlugin") as IPlugin;

我运行了这段代码并在第一个请求中假设它会将程序集加载到ram(或http运行时appdomain?)中,然后我可以创建其中任何内容的实例。

如果我再次运行此代码,请在第二个请求中说明第一次请求时程序集会发生什么情况?

ram中是否仍然存在?如果是这样,它如何区分两个组件?还是会覆盖以前的声明类?

这是我的理解,就像我在PHP中所做的那样,它不仅仅是“require_once”的情况。

1 个答案:

答案 0 :(得分:7)

这将加载程序集的两个不同副本,每个副本都可以从您的应用程序中使用。每个程序集中的类型是不同的类型,不会相互交互。例如,如果从Copy1获取Widget并尝试将其传递给在Copy2上获取Widget的方法,则会导致运行时失败。一旦以这种方式加载组件(即进入主AppDomain),就无法卸载组件。


关于实例化:

  • 如果您使用Assembly.CreateInstance(如帖子中所示),则会从您用于拨打电话的Assembly实例创建它。
  • 如果使用带有字符串的Activator.CreateInstance,则需要指定程序集名称。由于在这种情况下两个加载的程序集都具有相同的名称,因此它将使用程序集解析规则,我认为默认情况下,它将支持第一个匹配(因此首先加载的程序集。)我不确定这一点。您可以挂钩AppDomain.AssemblyResolve事件以提供自己的优先级,并使其使用最近加载的程序集。