在不同的AppDomain中加载具有依赖项的程序集

我的目标是在两个给定的文件夹之间进行缺少的依赖性检查。 想象一下以下设置。

根\ DIRA \ A.DLL

根\ DIRB \ B.DLL

B取决于A.

因此,给定这些文件夹,我想创建一个新的AppDomain,加载B.dll并让DirA(A.dll)的依赖关系自动解析并隔离在新的AppDomain中。

隔离是关键,因为当我卸载这个AppDomain时,我想创建一个新的,可能DirA再次作为依赖,但DirC库需要它,所以在DirC依赖DirB的情况下,我希望它抛出一个例外。

编辑:添加代码示例,以防有助于更好地描述我的问题。

AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = @"C:\Root"; setup.ApplicationName = "Isolated Domain" setup.PrivateBinPath = @"DirA;DirB"; setup.PrivateBinPathProbe = "";//disable search in AppBase.. var domain = AppDomain.CreateDomain(Guid.NewGuid().ToString(), AppDomain.CurrentDomain.Evidence, setup, AppDomain.CurrentDomain.PermissionSet); //The following statement in theory should pick B.dll's dependency from DirA. var assembly = domain.Load(AssemblyName.GetAssemblyName(@"C:\Root\DirB\B.dll").Name); //Do the same in a different domain for C.dll 

感谢您的帮助。

这看起来像是ResolveEventHandler的工作( 有关解析未知程序集的MSDN上的更多详细信息)

所以,你可以写类似的东西

 class MyResolver { public static Assembly MyResolveEventHandler( Object sender, ResolveEventArgs args ) { // confirm args.Name contains A.dll String dllName = args.Name.Split({','}, SplitStringOptions.None)[0]; if (dllName == "A") { return Assembly.LoadFile(@"C:\Root\DirA\A.dll") } return null; } } 

在您创建的域中,您将执行以下操作:

 domain.AssemblyResolve += new ResolveEventHandler(MyResolver.MyResolveEventHandler); 

确保在引用B中的A之前绑定事件。

AppDomain无法探测其初始文件夹之外的dll。 他们可以在GAC中进行探测,并在PrivateBinPath中深入到文件夹中,但是他们无法探测到其他文件夹。