gpt4 book ai didi

c# - Assembly.Load(byte[]) 是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 14:16:05 25 4
gpt4 key购买 nike

我只是想知道如果我在 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 运行时应用程序域?),然后我可以创建其中任何内容的实例。

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

Would 仍然存在于 ram 中吗?如果是这样,它如何区分这两个程序集?还是会覆盖之前声明的类?

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

最佳答案

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


关于实例化:

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

关于c# - Assembly.Load(byte[]) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8318798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com