Предоставление пути к сборке внешних dll зависимостей сборки - PullRequest
5 голосов
/ 31 мая 2011

У меня есть приложение C #, которое загружает набор управляемых сборок. Одна из этих сборок загружает две собственные библиотеки (каждая из них находится в разных местах), если они доступны. Я пытаюсь найти способ предоставить путь поиска для тех родных библиотек.

Есть ли другие варианты? Я действительно не хочу снабжать эти библиотеки моим программным обеспечением - копирование их в каталог программ, конечно, решает проблему.

Я пытался использовать SetDllDirectory системную функцию, но с ее помощью можно указать только один путь. Каждый вызов этой функции сбрасывает путь.

Установка ПУТЬ Переменная среды тоже не решает проблему: /

Ответы [ 3 ]

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

Это может помочь:

    private void Form1_Load(object sender, EventArgs e)
    {
        //The AssemblyResolve event is called when the common language runtime tries to bind to the assembly and fails.
        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);
    }

    //This handler is called only when the common language runtime tries to bind to the assembly and fails.
    Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string dllPath = Path.Combine(YourPath, new AssemblyName(args.Name).Name) + ".dll";
        return (File.Exists(dllPath))
            ? Assembly.Load(dllPath)
            : null;
    }
0 голосов
/ 11 марта 2019

Я знаю, что это был старый пост, но есть ответ: используя функцию LoadLibary, вы можете принудительно загрузить собственную DLL:

public static class Loader
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string fileName);
}

Вы должны вызывать это раньше, чем любая другая DLL - я обычно вызываю это в статическом конструкторе моей основной программы. Я должен был сделать это для DllImport(), и статические конструкторы всегда выполнялись до загрузки собственных DLL-файлов - они загружаются фактически только при первом вызове импортированной функции.

Пример:

class Program
{
    static Program()
    {
       Loader.LoadLibrary("path\to\native1.dll");
       Loader.LoadLibrary("otherpath\to\native2.dll");
    }
}

После загрузки библиотеки она должна удовлетворять DllImports() других управляемых сборок, которые вы загружаете. В противном случае они могут быть загружены с использованием другого метода, и у вас может не быть другого выбора, кроме как скопировать их локально.

Примечание: Это решение только для Windows. Чтобы сделать это более кроссплатформенным, вам придется самостоятельно определять операционные системы и использовать правильный импорт; например:

    [DllImport("libdl")] 
    public static extern IntPtr DLOpen(string fileName, int flags);

    [DllImport("libdl.so.2")]
    public static extern IntPtr DLOpen2(string fileName, int flags);
    // (could be "libdl.so.2" also: https://github.com/mellinoe/nativelibraryloader/issues/2#issuecomment-414476716)

    // ... etc ...
0 голосов
/ 31 мая 2011

Зарегистрируйте ваши dll в GAC. Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...