加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:49:36 所属栏目:百科 来源:网络整理
导读:我只是想知道如果我要在Web应用程序中加载相同的汇编字节两次会发生什么. 例如,我有这个代码 byte[] assem = System.IO.File.ReadAllBytes(appRoot + "/Plugins/Plugin.dll");var loadedAssem = Assembly.Load(assem);var plugin = loadedAssem.CreateInstan
我只是想知道如果我要在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”的情况.

解决方法

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

关于实例化:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读