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

时间:2013-03-28 14:25:41

标签: c#-4.0 plugins appdomain .net-assembly probing

设置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事件是否正常?

1 个答案:

答案 0 :(得分:0)

通过使用AssemblyName(string) .ctor 设置AssemblyName.CodeBase属性,您无法确定Assembly.Load(AssemblyName)是否会在默认上下文中加载它。它将首先尝试在默认上下文中加载它,但如果失败,它将使用代码库在LoadFrom上下文中加载它。有关详细信息,请查看有关该主题的Suzanne Cook's blog entry

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

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