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

本文关键字:何工作 工作 byte Assembly Load | 更新日期: 2023-09-27 18:16:22

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

例如我有这样的代码

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"的情况

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

这将加载程序集的两个不同副本,每个副本都可以从您的应用程序中使用。每个程序集中的类型都是不同的类型,彼此之间不能互操作。例如,如果您从Copy1中获取一个Widget,并试图将其传递给一个在Copy2中获取Widget的方法,这将导致运行时失败。一旦程序集以这种方式加载(即加载到主AppDomain中),就不可能卸载它们。


关于实例化:

  • 如果您使用程序集。创建实例(如您的帖子中所示),这将从您用于进行调用的Assembly实例创建它。
  • 如果您使用激活器。如果以字符串为参数的创建实例,则需要指定程序集名称。由于在本例中加载的两个程序集将具有相同的名称,因此它将使用程序集解析规则,我认为在默认情况下,这些规则将倾向于第一个匹配(因此您首先加载的程序集)。对此我不确定。你可以钩住AppDomain。AssemblyResolve事件提供您自己的优先级,并使其使用最近加载的程序集。