1

设置 AssemblyName.CodeBase 是否会强制在 LoadFrom 上下文中加载程序集?

我正在研究一种插件系统。我需要能够使用 Type.GetType 等...在我的代码中的任何地方,我都不必知道 Type 是否来自插件 dll。

我的插件位于我的应用程序(windows/web)的 bin 目录下的 Plugins 文件夹中,每个插件都在它自己的文件夹中。

我将探测路径设置为 Plugins(或 bin;bin\Plugins for web),即使它没有任何区别,因为它们位于子文件夹中。

我像这样加载我的插件

pluginInfo.EntryAssemblyName = new AssemblyName(myAssemblyName);

pluginInfo.EntryAssemblyName.CodeBase = assemblyPath;

pluginInfo.EntryAssembly = Assembly.Load(pluginInfo.EntryAssemblyName);

注意:PluginInfo 只是一个保持我的插件状态的类。

我想知道,因为我设置了程序集名称 Assembly.Load 的 CodeBase 属性,即使它不在探测路径中也能够找到我的程序集,这是否意味着程序集在默认上下文中加载或从上下文中加载?

再次为入口程序集引发 AssemblyResolve 事件是否正常?

4

1 回答 1

0

通过使用AssemblyName(string) .ctor设置AssemblyName.CodeBase属性,您无法确定Assembly.Load(AssemblyName)将在默认上下文中加载它。它将首先尝试在默认上下文中加载它,但如果失败,它将使用代码库在 LoadFrom 上下文中加载它。查看Suzanne Cook 关于该主题的博客文章以获取更多信息。

为确保程序集将在默认上下文中加载,请不要设置AssemblyName.CodeBase属性并为System.IO.FileLoadException做好准备。如果对象构造成功(未引发异常),则程序集在默认上下文中加载。

LoadFrom 上下文的优点是,如果加载的程序集存在于同一路径上,则可以解析它们的依赖关系。另一方面,加载在默认上下文中的程序集只有在 GAC、AppDomain.BaseDirectoryAppDomain.RelativeSearchPath. 可能会引发该AppDomain.AssemblyResolve事件,因为在这些位置中找不到加载的程序集的依赖项。

于 2013-03-29T14:06:02.730 回答