Как использовать несколько версий DLL? - PullRequest
0 голосов
/ 04 мая 2011

Хорошо

У меня здесь странный человек.

В настоящее время у нас есть инструментальное приложение, которое позволяет нам создавать плагины, которые являются просто DLL-библиотеками с пользовательскими контролами, которые я просто загружаю с помощью Assembly.Load и создаю новый экземпляр, добавляя его в панель для использования.

Однако в плагин могут быть включены сторонние библиотеки.

Как я могу справиться с этим?

Я попытался заархивировать плагин и прочитать сборку через байт [], но я получаю ошибку при попытке загрузки, пропуская зависимую dll, поэтому я пошел еще дальше, добавил зависимые dll в zip и прочитал их, так же ошибка ..

Возможно, я смогу создать папку с именем плагина с зависимыми DLL?

1 Ответ

0 голосов
/ 04 мая 2011


Недавно у меня был проект с точно такой же проблемой.Вот как я решил это:
- создайте отдельный каталог для каждого модуля (плагина), внутри я помещаю основную библиотеку module.dll и каталог lib , куда я помещаю все зависимые от модуля библиотеки.
- в основное событие Form_Load положить

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

, где LoadModuleResolveEventHandler равно:

private Assembly LoadModuleResolveEventHandler(object sender, ResolveEventArgs args)
{
    if (pluginDirectory != null)
    {
        string path = Path.Combine(pluginDirectory , "lib");
        if (Directory.Exists(path))
            foreach (string file in Directory.GetFiles(path))
            {
                if (AssemblyName.GetAssemblyName(file).FullName == args.Name)
                {
                    //Return the loaded assembly.
                    return Assembly.LoadFrom(file);
                }
            }
    }
    return null;
}

Приложение заставляет искать в pluginDirectory (гдемодуль плагина - это) / lib подкаталог, для которого есть ссылка на .dll, и вернуть его, если найденЯ сделал подобное в коде плагина, может быть, вам не нужно ... Вот и все.

Другая возможность - добавить в проект новый элемент: Файл конфигурации приложения и поместить следующий код:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="lib;lang" />
    </assemblyBinding>
  </runtime>
</configuration>

Создает файл application_name.exe.config, который необходимо развернуть с помощью mainФорма исполняемого файла и указывает дополнительные каталоги, где искать разрешение сборки.

Вы можете подать любое из этих решений и посмотреть, как они работают.
С уважением,
mj82

...