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



设置AssemblyName。CodeBase强制程序集在LoadFrom上下文中加载?

我正在研究一种插件系统。我需要能够使用类型。方法等等……在我的代码中的任何地方,我都不应该知道类型是否来自插件dll。

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

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

我像这样加载我的插件

pluginInfo.EntryAssemblyName = new AssemblyName(myAssemblyName);
pluginInfo.EntryAssemblyName.CodeBase = assemblyPath;
pluginInfo.EntryAssembly = Assembly.Load(pluginInfo.EntryAssemblyName);

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

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

对于条目程序集再次引发AssemblyResolve事件是否正常?

通过使用AssemblyName(string) .ctor 设置AssemblyName.CodeBase属性,您不能确保Assembly.Load(AssemblyName)将在默认上下文中加载它。它将首先尝试在默认上下文中加载它,但如果失败,它将使用代码库在LoadFrom上下文中加载它。查看苏珊娜·库克关于这一主题的博客文章,了解更多信息。

要确保程序集将在默认上下文中加载,不要设置AssemblyName.CodeBase属性,并准备system . io . fileloadeexception。如果成功构造了对象(没有抛出异常),则在默认上下文中加载了程序集。

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

最新更新