.Net 6 Docker容器错误“系统.DllNotFoundException:无法加载共享库'ole32.dll'或它的某个依赖项”

wfveoks0  于 2023-01-01  发布在  Docker
关注(0)|答案(1)|浏览(133)

我打开了一个Web核心API与. NET 6通过Visual Code 2022。我添加了以下行,它是正确的工作在我的本地,但当我试图运行它在我的码头桌面崩溃。代码使用此包:"TitaniumAS. Opc.客户端.核心.设计"

TitaniumAS.Opc.Client.Bootstrap.Initialize();

            Uri url = UrlBuilder.Build("Graybox.Simulator.1");

            using (var server = new OpcDaServer(url))
            {                
                server.Connect();

                OpcDaGroup group = server.AddGroup("MyGroup");
                group.IsActive = true;

                var definition1 = new OpcDaItemDefinition
                {
                    ItemId = "numeric.random.int64",
                    IsActive = true
                };
                var definition2 = new OpcDaItemDefinition
                {
                    ItemId = "numeric.random.int32",
                    IsActive = true
                };

                OpcDaItemDefinition[] definitions = { definition1, definition2 };
                OpcDaItemResult[] results = group.AddItems(definitions);

                foreach (OpcDaItemResult result in results)
                {
                    if (result.Error.Failed)
                        Console.WriteLine("Error adding items: {0}", result.Error);
                }

                while (true)
                {
                    OpcDaItemValue[] values = group.Read(group.Items, OpcDaDataSource.Device);
                    Console.WriteLine("Value is {0}", Convert.ToString(values[0].Value));

                    Thread.Sleep(3000);
                }

停靠文件:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 5045

ENV ASPNETCORE_URLS=http://+:5045

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["OPC-DA.csproj", "./"]
RUN dotnet restore "OPC-DA.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "OPC-DA.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "OPC-DA.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "OPC-DA.dll"]

我还把我的docker-desktop目标切换为windows。当运行行时,它会因为第一行而崩溃。
错误:
失败:Microsoft. AspNetCore.服务器. Kestrel [13]连接ID "0HMN2H4AOJ5LQ",请求ID "0HMN2H4AOJ5LQ:应用程序引发了未经处理的异常。System.DllNotFoundException:无法加载共享库"ole32.dll"或它的某个依赖项。为了帮助诊断加载问题,请考虑设置LD_DEBUG环境变量:libole32.dll:无法打开共享目标文件:无此文件或目录

slmsl1lt

slmsl1lt1#

我假设这是您在项目中引用的NuGet包:https://www.nuget.org/packages/TitaniumAS.Opc.Client。该包是为.NET Framework而不是.NET Core构建的。您的构建输出可能会显示有关该事实的警告。类似于:

Package 'TitaniumAS.Opc.Client 1.0.2' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8, .NETFramework,Version=v4.8.1' instead of the project target framework 'net6.0'. This package may not be fully compatible with your project

从.NET Core调用.NET Framework程序集 * 可以 * 工作,但不能保证一定能工作。
下一个问题与目标平台有关。由于Titanium程序集是用于.NET Framework的,因此它只能在Windows上运行。根据您提供的错误消息,看起来你的目标是Linux容器。由于这个Titanium的依赖性,这是行不通的。它试图找到一个Windows DLL,显然在Linux上不存在。相反,你会希望目标是Windows容器。因此,您首先需要更新Docker桌面以针对Windows容器。
你不需要改变你的Dockerfile,你使用的标签6.0是动态的,可以在Linux和Windows上使用,根据你的目标容器平台类型给你合适的映像。

相关问题