设置AssemblyName.CodeBase是否强制将程序集加载到LoadFrom上下文中?
设置AssemblyName.CodeBase是否强制将程序集加载到LoadFrom上下文中?设置AssemblyName.CodeBase是否强制将程序集加载到LoadFrom上下文中?
我正在研究一种插件系统。我需要能够使用Type.GetType等...在我的代码中的任何地方,我不应该知道该类型是否来自一个插件的DLL或不。
我的插件位于我的应用程序的bin目录(windows/web)下的一个文件夹中,每个插件位于它自己的文件夹中。
我将探测路径设置为Plugins(或bin; bin \ Plugins for web),即使它们在子文件夹中没有任何区别。
我载入我的插件这样
pluginInfo.EntryAssemblyName = new AssemblyName(myAssemblyName);
pluginInfo.EntryAssemblyName.CodeBase = assemblyPath;
pluginInfo.EntryAssembly = Assembly.Load(pluginInfo.EntryAssemblyName);
注:PluginInfo仅仅是让我的插件的状态的类。
我想知道,因为我设置了程序集名称的CodeBase属性Assembly.Load能够找到我的程序集,即使它不在探测路径中,是否意味着程序集会在默认上下文中加载或加载从上下文?
AssemblyResolve事件在进入程序集之后再次引发是否正常?
通过使用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
事件,因为在这些流行中无法找到加载的程序集的依赖关系。
我的问题是,如果我没有设置CodeBase属性,它找不到Assembly,因为它位于Plugins文件夹的子文件夹中,并且此文件夹不在探测路径中。是否可以在运行时设置探测路径? –
@Yann您可以在应用程序的配置文件中使用探测元素。 http://msdn.microsoft.com/en-us/library/823z9h8w.aspx –
问题是,我不知道运行时间之前的文件夹,除非我的插件编辑我不太喜欢的配置文件。 –