gpt4 book ai didi

c# - C# + C++ 中的 Windows 服务拒绝在 Docker 中启动

转载 作者:行者123 更新时间:2023-11-30 03:23:02 25 4
gpt4 key购买 nike

我在 VS 2017 中创建了一个包含 2 个主要项目(和常见项目)的解决方案。该体系结构说明了一个非常大的遗留项目,因此无法更改。主项目是一个 .Net 可执行文件,它的主类继承自“ServiceBase”类,以便用作 Windows 服务。它定义了 WCF 端点并使用接口(interface)“IWcfXmlServer”来处理请求。另一个项目是一个 C++ 项目,其中包含一个实现“IWcfXmlServer”接口(interface)并用于处理请求的类。

我在本地创建了一个 Windows 服务并将其指向解决方案的 .exe 文件,它工作正常。

下一步是将该应用程序放在 Docker 容器中。我添加了 Docker 支持,它添加了“docker-compose”.yml 文件:

version: '3.4'

services:
wcfservice:
image: ${DOCKER_REGISTRY}wcfservice
build:
context: .\..\WcfService
dockerfile: Dockerfile

和一个 Dockerfile:

FROM microsoft/dotnet-framework:4.7.1-windowsservercore-1709
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["C:\\app\\WcfService.exe"]

当我构建解决方案并开始调试时,我得到:

Cannot start service from the command line or a debugger. A Windows Service must first be installed (using installutil.exe) and then started with the ServerExplorer, Windows Services Administrative tool or the NET START command.

但仍然会创建容器。

我在创建的 Docker 容器中打开 PowerShell 并使用“New-Service”创建一个新服务并将其指向我的 .exe 文件。当我尝试运行 Start-Service 时出现错误。

我使用 Windows 事件日志来获取错误描述:

EntryType : Error Message : Service cannot be started. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'testole.dll' or one of its dependencies. The specified module could not be found. at WcfService.WcfXmlServerFacade..ctor() --- End of inner exception stack trace --- at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.ServiceModel.Description.ServiceDescription.CreateImplementation(Type serviceType) at System.ServiceModel.Description.ServiceDescription.SetupSingleton(ServiceDescription serviceDescription, Object implementation, Boolean isWellKnown) at System.ServiceModel.Description.ServiceDescription.GetService(Type serviceType) at System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& implem... Source : WcfService1

  • 'testole.dll' 是我编译的 c++ 项目。** 我已经检查过“testole.dll”是否存在于容器内 .exe 文件的同一目录中。

我无法弄清楚为什么它无法运行 C++ dll,也无法弄清楚如何获取有关错误的更多信息 (Console.Writeine()\Debug.Writeine()) 由于某种原因不起作用。

提前致谢。

最佳答案

您很可能缺少 Visual C++ Redistributable 包。我怀疑它没有默认安装在 Windows docker 图像上。

尝试将以下行(用于下载 VC++ 2015 Update 3 x64)添加到 FROM 行下方的 Dockerfile 中:

ADD https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe /vc_redist.x64.exe
RUN C:\vc_redist.x64.exe /quiet /install

来源 ( https://github.com/Microsoft/dotnet-framework-docker/issues/15 )

关于c# - C# + C++ 中的 Windows 服务拒绝在 Docker 中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50674314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com