我有一个使用.NET Core和C#开发,在Docker上运行的项目,需要调用几个用C++开发的DLL函数。问题是:当我在Windows上使用Visual Code运行我的项目时,代码可以平稳运行,但是当我在Linux容器上的Docker上运行时,代码尝试执行DLL函数时会抛出错误。
我已经尝试将.dll文件复制到/lib文件夹中,改为项目的父文件夹,但都没有成功。我开始怀疑问题是找不到文件,并通过一些研究发现可能与文件权限有关,因此我对.dll文件运行chmod a+wrx命令,但仍然不成功。
这是我的Dockerfile配置:
这是试图访问DLL函数的代码:
我已经尝试将.dll文件复制到/lib文件夹中,改为项目的父文件夹,但都没有成功。我开始怀疑问题是找不到文件,并通过一些研究发现可能与文件权限有关,因此我对.dll文件运行chmod a+wrx命令,但仍然不成功。
这是我的Dockerfile配置:
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
WORKDIR /app
EXPOSE 80
RUN apt-get update \
&& apt-get install -y --allow-unauthenticated \
libc6-dev \
libgdiplus \
libx11-dev \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& apt-get install -y poppler-utils
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app
COPY . .
RUN dotnet restore --configfile Nuget.config -nowarn:msb3202,nu1503
RUN dotnet publish -c Release -o ./out
FROM base AS final
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "MdeGateway.dll"]
这是试图访问DLL函数的代码:
[DllImport("MyDll.dll")]
private static extern int dllfunction(Int32 argc, IntPtr[] argv);
public static void CallDll(string[] args)
{
IntPtr[] argv = ArrayToArgs(args);
dllfunction(args.Length, argv);
FreeMemory(args, argv);
}
当执行“dllfunction(args.Length, argv);”这一行时,会出现错误。
具体的错误消息如下:
"无法加载共享库'MyDll.dll'或其某个依赖项。为了帮助诊断加载问题,请考虑设置LD_DEBUG
环境变量:libMyDll.dll: 无法打开共享对象文件: 没有那个文件或目录"
另外,如果有人能教我如何设置LD_DEBUG
环境变量,我会非常感激。
docker run
步骤中的-e "LD_DEBUG=true"
(不知道true
是否是正确的值)或者在dockerfile
中使用ENV LD_DEBUG=true
来设置 Docker 的环境变量。https://vsupalov.com/docker-arg-env-variable-guide/#setting-env-values - Der KommissarENV LD_DEBUG=true
时,出现了warning: debug option true' unknown;
的警告,因此true不是该变量的有效值。在下面添加了一个答案,解决了设置LD_DEBUG
的有效值的问题。 - Veverke