2016-09-12 3 views
-1

У меня есть проект WPF DLL, который содержит мои пользовательские элементы управления, темы, стили и т. Д., Который построен как AnyCPU.Динамически разрешить зависимость в Runtime в C# DLL

У меня есть зависимость от элемента управления веб-браузером с открытым исходным кодом, который не имеет встроенной поддержки AnyCPU, но имеет отдельные сборки x86/x64.

В EXE это довольно просто. Я могу обработать проверку событий AppDomain.CurrentDomain.AssemblyResolve для 64-битного процесса и выполнить Assembly.LoadFile с соответствующими сборками.

Как мне динамически разрешить зависимость во время выполнения в проекте DLL?

+0

Мой вопрос: вам даже нужно? Можете ли вы добавить свой проект DLL в качестве ссылки в свой проект EXE и решить проблему динамической сборки для сторонней DLL, и она будет работать? Ты пробовал? Любые ошибки? – Zack

+0

Или вам, возможно, придется просто создавать свой DLL-проект как x86 и x64 и динамически загружать его также ... У меня нет большого опыта динамического разрешения, поэтому я могу быть в стороне, просто пытаясь придумать решение. – Zack

+0

Попробуйте http://stackoverflow.com/questions/108971/using-side-by-side-assemblies-to-load-the-x64-or-x32-version-of-a-dll/156024#156024 и http: //stackoverflow.com/questions/2963809/anycpu-x86-x64-for-c-sharp-application-and-its-c-cli-dependency – neohope

ответ

-1

Получается, я переусердствовал.

В моей WPF DLL у меня есть собственный класс управления, который использует элемент управления веб-браузером с открытым исходным кодом.

В статическом конструкторе пользовательского элемента управления я устанавливаю обработчик для события AppDomain.CurrentDomain.AssemblyResolve.

И для моего обработчика:

private static Assembly Resolver(object sender, ResolveEventArgs args) 
    { 
     if(args.Name.StartsWith("CefSharp")) 
     { 
      string assemblyName = args.Name.Split(new[] { ',' }, 2)[0] + ".dll"; 
      string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "CefSharp", Environment.Is64BitProcess ? "x64" : "x86", assemblyName); 
      return File.Exists(archSpecificPath) ? Assembly.LoadFile(archSpecificPath) : null; 
     } 

     return null; 
    } 

В обработчике я проверяю, если узел CefSharp решается, и если да, то я создаю путь к правильной сборке на основе, если моя сборка работает в 64-битном процессе или нет, а затем выполните Assembly.LoadFile().

Надеюсь, это полезно!