После обработки событие AssemblyResolve все еще получает исключение FileNotFound

Я занимался AssemblyResolveно я все еще получаю FileNotFoundException, Я подписался на событие в инициализаторе типа и вызываю Assembly.LoadFrom метод в Main-метод:

class Program
{
    static Program()
    {
        AppDomain.CurrentDomain.AssemblyResolve+=new ResolveEventHandler(DeployAssemblyHandler);
    }

    static void Main(string[] args)
    {      
        try
        {
            System.Reflection.Assembly asm=Assembly.LoadFrom("AxInterop.SHDocVw.dll");            
        }
        catch(Exception)
        {
        }
    }

    public static System.Reflection.Assembly DeployAssemblyHandler(object sender,ResolveEventArgs args)
    {            
        Assembly asm = null;
        string asmName = new AssemblyName(args.Name).Name;

        string deployAssemblyDirPath = ""; // Common.AppUtil.InstallDir + AppUtil.DeployedAssemblyDir;

        string[] deployDirectories = Directory.GetDirectories(deployAssemblyDirPath);            

        foreach(string deploy in deployDirectories)
        {
            try
            {
                asm = Assembly.LoadFrom(deploy + "\\" + asmName);
                break;
            }
            catch (Exception ex) { }
        }                   
        return asm;
    }
}

4 ответа

У меня была похожая проблема, и я закончил с использованием нового AppDomain AND (важно!), Устанавливающего свойство PrivateBinPath. Хорошая вещь о другом AppDomain заключается в том, что вы можете выгрузить сборку, если она вам больше не нужна. (Мой) пример кода:

  public class ProxyDomain : MarshalByRefObject
  {
      public bool TestAssembly(string assemblyPath)
      {
         Assembly testDLL = Assembly.LoadFile(assemblyPath);
         //do whatever you need 

         return true;
      }
   }

 AppDomainSetup ads = new AppDomainSetup();
 ads.PrivateBinPath = Path.GetDirectoryName("C:\\some.dll");
 AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads);
 ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName);
 bool isTdll = proxy.TestAssembly("C:\\some.dll");
 AppDomain.Unload(ad2);

РЕДАКТИРОВАТЬ: на основе вашего комментария вы просто ищете неправильный обработчик событий. В вашем случае вы должны использовать Событие AppDomain.UnhandledException, потому что Событие AssemblyResolve имеет другое назначение.

Проблема в том, что AssemblyName.Name свойство возвращает имя сборки без расширения. Вам нужно будет добавить ".dll" до конца пути. (Предупреждение: это очевидно сломается, если расширение сборки не.dll)

Добавьте AxInterop.SHDocVw.dll в папку bin, она должна работать.

Попробуйте использовать Assembly.Load в методе Main вместо Assembly.LoadFrom,Assembly.LoadFrom не должен даже вызывать ваш собственный распознаватель.

Другие вопросы по тегам