Не удается загрузить динамическую библиотеку в приложении .NET в Linux

#.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 для Linux

4. @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 в папке сборки. Однако я получаю ту же ошибку