#.net #docker #visual-studio-mac #dynamic-library
Вопрос:
Не удается загрузить динамическую библиотеку в Linux
- Я создал проект на Mac OS, и результатом были
libmylibrary.so
libmylibrary.dylib
файлы a и. - Я скопировал проект
.dylib
в консоль Visual Studio и смог загрузить и вызвать функции библиотеки с помощью этойDllImport
функции. Проект работает так, как и ожидалось - Я скопировал проект (включая файлы
.so
и.dylib
) в контейнер Docker на базе Ubuntu - Когда я запускаю проект с помощью
dotnet run
, я получаю следующую ошибку
System.DllNotFoundException: Unable to load shared library 'mylibrary' or one of its dependencies. In order to help diagnose loading problems, consider setting the DYLD_PRINT_LIBRARIES environment variable: dlopen(libmylibrary, 1): image not found
Правка 1
Ниже приведен файл Dockerfile, используемый для создания контейнера
FROM streetcred/dotnet-indy AS base
WORKDIR /app
# Expose the default port
EXPOSE 5000
COPY SomeProject/ ./
RUN dotnet restore "SomeProject.csproj"
RUN dotnet build "SomeProject.csproj" -c Release -o build
RUN dotnet publish "SomeProject.csproj" -c Release -o build
RUN COPY libmylibrary.dylib build/libmylibrary.dylib
RUN COPY libmylibrary.so build/libmylibrary.so
CMD dotnet build/SomeProject.dll --urls http://0.0.0.0:5000
Правка 2
Я попробовал следующее, но получаю ту же ошибку
- Скомпилируйте
mylibrary
проект в контейнере докеров Linux (Ubuntu) - Скопируйте сгенерированный
mylibrary.so
файл вSomeProject
Правка 3
Основываясь на комментариях @paladin324, я попытался сделать следующее, но получил ту же ошибку
LD_LIBRARY_PATH=/app/SomeProject/build
cd /app/SomeProject/build
dotnet SomeProject.dll --urls http://0.0.0.0:5000
Комментарии:
1. Как выглядит ваш док-файл?
2. @MattThalman, добавил файл Dockerfile в описание
3. macOS-это не Linux (он получен из FreeBSD, варианта Unix) . Службы и API-интерфейсы разные.
.dylib
является расширением для динамических библиотек macOS и не будет работать ни в одном дистрибутиве Linux. Вам придется перекомпилироватьmylibrary
для Linux4. @PanagiotisKanavos, попробовал твое предложение. Получаю ту же ошибку. Пожалуйста, обратитесь к
Edit 2
разделу в описании5. Является
mylib.so
ли собственная библиотека (C )? Библиотеки .NET всегда имеют имена.dll
, независимо от операционной системы.
Ответ №1:
.NET использует соглашения об именах платформы. DllImport("myLibrary")
будет искать файл с именем libmylibrary.so
(исходное имя файла двоичного файла). Попробуйте изменить:
RUN COPY mylibrary.so build/mylibrary.so
Для
RUN COPY mylibrary.so build/umylibrary.so
Комментарии:
1. Я исправил
RUN COPY
команду вEdit 1
разделе описания. У меня есть файлыmylibrary.so
,umylibrary.so
иlibmylibrary.so
в папке сборки. Однако я получаю ту же ошибку