.net - 无法在 Linux 上的 .NET 应用程序中加载动态库
问题描述
无法在 Linux 上加载动态库
- 我在 Mac OS 上构建了一个项目,输出是一个
libmylibrary.so
和libmylibrary.dylib
文件。 - 我将其复制
.dylib
到 Visual Studio 控制台项目中,并且能够使用该函数加载和调用库的DllImport
函数。该项目按预期工作 - 我将项目(包括
.so
和.dylib
文件)复制到基于 Ubuntu 的 Docker 容器中 - 当我使用运行项目时
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 Docker 容器 (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
解决方案
.NET 使用平台的命名约定。
DllImport("myLibrary")
将寻找一个名为libmylibrary.so
(二进制文件的原始文件名)的文件。尝试改变:
RUN COPY mylibrary.so build/mylibrary.so
至
RUN COPY mylibrary.so build/umylibrary.so
推荐阅读
- php - 此路由不支持 GET 方法。支持的方法:插入数据时的 POST
- git - 压缩多个提交的正确方法
- python - Python中的二叉树级顺序遍历
- azure - 一个 Azure 移动应用服务可以用于 Android 和 iOS 应用吗?
- graphics - blitting时如何保持目标表面的原始形状?
- sql - 如何优化(TimescaleDB/PostgreSQL)时间序列 SQL 查询
- ios - 检测转换后的 CAShapeLayer 路径上的点击
- react-redux - 为什么是 Redux,初学者为什么不使用 useContext + useReducer?
- mysql - 按组从值中减去
- javascript - 在 node.js 中处理大文件需要多长时间?