3

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

根\DirA\A.dll

根\DirB\B.dll

B依赖于A。

因此,鉴于这些文件夹,我想创建一个新的 AppDomain,加载 B.dll 并在新的 AppDomain 中自动解析和隔离来自 DirA(A.dll) 的依赖项。

隔离是这里的关键,因为当我卸载这个 AppDomain 时,我想创建一个新的 AppDomain 可能再次作为依赖项,但是 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

感谢您提供任何帮助。

4

2 回答 2

3

这看起来像是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 之前绑定事件。

于 2012-08-17T16:11:25.820 回答
1

AppDomain 无法探测初始文件夹之外的 dll。他们可以在 GAC 和 PrivateBinPath 中更深入地探测文件夹,但不能探测其他文件夹。

于 2012-08-16T16:00:18.637 回答