Невозможно загрузить динамическую библиотеку (DYLIB) в MacOS - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь загрузить библиотеку (скажем, ArithmeticOprn.dylib ) динамически и вызвать методы, представленные в этой библиотеке.Пожалуйста, обратитесь к фрагменту кода ниже:

[DllImport("libdl.dylib")]
public static extern IntPtr dlopen(String fileName, int flags);

[DllImport("ArithmeticOprn.dylib")]
public static extern double Add(double a, double b);

static void Main(string[] args)
{
    dlopen("path/to/ArithmeticOprn.dylib", 2);
    double result = Add(1, 2);
}

При запуске приведенного выше примера в MacOS я получил следующее исключение:

Невозможно загрузить DLL "ArithmeticOprn.dylib ": указанный модуль или одна из его зависимостей не найдены.

Но, когда я указываю полный путь в DllImport, вызов метода работает, и я могу получить ожидаемыйРезультаты.Для справки, пожалуйста, обратитесь к фрагменту кода ниже.

[DllImport("path/to/ArithmeticOprn.dylib")]
public static extern double Add(double a, double b);

Не могли бы вы сообщить мне, что мне не хватает?Заранее спасибо:)

1 Ответ

0 голосов
/ 26 ноября 2018

Вы пытаетесь сократить поведение DllImport с помощью явного dlopen - то есть, используя dlopen, чтобы указать путь, который должен использоваться DllImport.Проблема в том, что соединение DllImport выполняется внутренне со временем выполнения C# до вызова dlopen.

dlopen никогда не заглядывает.

Чтобы использовать DllImport без пути, вам нужно полагаться на поведение поиска по умолчанию, которое определяется местоположением, указанным переменными среды $LD_LIBRARY_PATH, $DYLD_LIBRARY_PATH, текущим рабочим каталогом,$DYLD_FALLBACK_LIBRARY_PATH.

Так, например:

env DYLD_LIBRARY_PATH=path/to/ mono test.exe

, который запускает моно-интерпретатор с путем, предварительно загруженным path/to, что позволяет ему найти dylib в этомlocation.

Другие решения включают перемещение библиотеки в каталог с исполняемым файлом, создание символической ссылки на библиотеку в текущем рабочем каталоге.

...