Как загрузить сборку, которая ссылается на Win32 DLL?

2

Я разрабатываю приложение .NET, которое использует отражение для загрузки плагинов. Мои плагины - это библиотеки классов С#. Проблема в том, что некоторые из моих плагинов ссылаются на обычные DLL файлы Win32, а С# слепо пытается загрузить зависимости, как если бы они были DLL-библиотеками .NET.

Вот как я загружаю плагин:

string fileName = "plugin.dll";
Assembly.LoadFrom(fileName);

Я получаю System.BadImageFormatException со следующим сообщением:

Could not load file or assembly 'plugin.dll' or one of its dependencies.
The module was expected to contain an assembly manifest.

Как программно загружать сборку, которая ссылается на DLL файлы Win32?

Теги:
plugins

3 ответа

1

Если вам нужна только часть функций из DLL, вы можете сделать это:

  [DllImport("plugin.dll")]
  public static extern void SomeFunction();
1

Вы хотите что-то вроде следующего:

foreach (string filePath in Directory.GetFiles(path, "*.DLL"))
{
    try
    {
        _assemblies.Add(Assembly.LoadFile(filePath));
    }
    catch (FileNotFoundException)
    {
        // Attempted to load something with a missing dependency - ignore.
    }
    catch (BadImageFormatException)
    {
        // Attempted to load unmanaged assembly - ignore.
    }
}

Вам все равно нужно убедиться, что ваши зависимые управляемые или родные доступны, а не загружать собственные DLL файлы случайно. Для управляемых сборок может потребоваться изменить путь .net-зондирования в app.config, чтобы убедиться, что они найдены:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="modules"/>
        </assemblyBinding>
    </runtime>

В идеале вы хотите поместить свои плагины в отдельный каталог, вызвав LoadFile на множестве сборок, которые вам не интересны, и если вы загрузили сборку в AppDomain, вы не можете ее выгрузить.

1

Вы пробовали Assembly.LoadFile()?

Помните, что LoadFile не загружает файлы в контекст LoadFrom и не разрешает зависимости, используя путь загрузки, как это делает метод LoadFrom. LoadFile полезен в этом ограниченном сценарии, потому что LoadFrom нельзя использовать для загрузки сборок с одинаковыми идентификаторами, но с разными путями; он будет загружать только первую такую ​​сборку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню