AppDomain.AssemblyResolve的异常设置处理程序

时间:2009-08-03 13:23:48

标签: c# .net appdomain

创建一个新的appdomain,设置assemblyResolve处理程序和 你总是得到一个例外,说'找不到装配[当前正在执行的装配]

是什么给出的?代码在下面

string _fileName = @"c:\temp\abc123.dll";

AppDomain sandBox = AppDomain.CreateDomain("sandbox");

sandBox.AssemblyResolve += new ResolveEventHandler(sandBox_AssemblyResolve); 
// the line generates the exception !

System.Reflection.Assembly asm = sandBox.Load(System.Reflection.AssemblyName
                                     .GetAssemblyName(fileName).FullName);

foreach (System.Reflection.AssemblyName ar in asm.GetReferencedAssemblies())
    dbgWrite("Ref:  " + ar.FullName );


System.Reflection.Assembly sandBox_AssemblyResolve
  (object sender, ResolveEventArgs e)
{

    System.Reflection.Assembly asm = 
        System.Reflection.Assembly.LoadFrom(_fileName);
    return asm;

}

例外是:

System.IO.FileNotFoundException:无法加载文件或程序集'appAdmin,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。该系统找不到指定的文件。文件名:'appAdmin,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'[snip]

2 个答案:

答案 0 :(得分:1)

您正在尝试加载不在AppDomain基本位置下的程序集。我也从未让AssemblyResolve事件为我工作。

我建议将你的基础外部程序集加载到一个字节数组(System.IO.File.ReadAllBytes)中,然后将该数组to your newly created AppDomain to load交给它。

答案 1 :(得分:1)

您的解析程序可能无法在您的新AppDomain上触发,请尝试在AppDomain.CurrentAppDomain上设置它。

AppDomain.CurrentDomain.AssemblyResolve + = new ResolveEventHandler(sandBox_AssemblyResolve);

在sandBox_AssemblyResolve方法中,您可以从您喜欢的任何目录加载程序集,这是来自byte []的加载可能起作用的地方。

至于使用byte []加载程序集这可以修复文件锁定问题,它无法修复我认为不会看到的问题here