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

例如,我有这个代码

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 Runtime AppDomain?)中,然后我可以创建其中的内容。

如果我再次运行此代码,请在第二个请求中说出第一个请求中的汇编会发生什么?

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

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

有帮助吗?

解决方案

这将加载两个不同的组件副本,每个副本都可以从您的应用程序中使用。每个组件中的类型都是不同的类型,不会与另一个组合相互互动。例如,如果您从copy1中获取一个小部件并尝试将其传递给在copy2上使用小部件的方法,则将导致运行时故障。一旦以这种方式加载它们(即进入您的主要应用程序),就无法卸载程序集。


关于实例化:

  • 如果您使用assembly.createinstance(如帖子所示),则将从您用来拨打电话的汇编实例中创建它。
  • 如果使用Activator.CreateinStance,则需要指定汇编名称。由于两个加载的组件在这种情况下都将具有相同的名称,因此它将使用汇编分辨率规则,我认为默认情况下,它将偏爱第一匹匹配(因此您首先加载的组件。)我不确定这一点。你可以钩住 AppDomain.semblyresolve 事件以提供您自己的优先级,并使其使用最固定的装配体。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top