设置AssemblyName.CodeBase是否强制在LoadFrom上下文中加载程序集?
我正在开发一种插件系统。我需要能够使用Type.GetType等...在我的代码中的任何地方我都不应该知道Type是否来自插件dll。
我的插件位于我的应用程序(windows / web)的bin目录下的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事件是否正常?
答案 0 :(得分:0)
通过使用AssemblyName(string) .ctor 和设置AssemblyName.CodeBase
属性,您无法确定Assembly.Load(AssemblyName)是否会在默认上下文中加载它。它将首先尝试在默认上下文中加载它,但如果失败,它将使用代码库在LoadFrom上下文中加载它。有关详细信息,请查看有关该主题的Suzanne Cook's blog entry。
为确保程序集将在默认上下文中加载,不设置AssemblyName.CodeBase
属性并为System.IO.FileLoadException做好准备。如果成功构造对象(不抛出异常),则在默认上下文中加载程序集。
LoadFrom上下文的优点是,如果加载的程序集存在于同一路径上,则可以解析它们的依赖关系。另一方面,仅当GAC上存在AppDomain.BaseDirectory
或AppDomain.RelativeSearchPath
时,才能解析在默认上下文中加载的程序集。可能会引发AppDomain.AssemblyResolve
事件,因为在这些loactions中找不到已加载程序集的依赖项。