Windows C# + C++ 中的服务拒绝在 Docker 中启动
Windows service in C# + C++ is refusing to start in Docker
我在 VS 2017 中创建了一个包含 2 个主要项目(和常见项目)的解决方案。该体系结构说明了一个非常大的遗留项目,因此无法更改。
主项目是一个 .Net 可执行文件,它的主要 class 继承自 'ServiceBase' class,以便用作 Windows 服务。它定义了 WCF 端点并使用接口 'IWcfXmlServer' 来处理请求。
另一个项目是一个带有 class 的 C++ 项目,它实现了 'IWcfXmlServer' 接口并用于处理请求。
我在本地创建了一个 Windows 服务并将其指向解决方案的 .exe 文件,它工作正常。
下一步是将该应用程序放在 Docker 容器中。
我添加了 Docker 支持,其中添加了 "docker-compose" .yml 文件:
version: '3.4'
services:
wcfservice:
image: ${DOCKER_REGISTRY}wcfservice
build:
context: .\..\WcfService
dockerfile: Dockerfile
和一个Docker文件:
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)
我在 VS 2017 中创建了一个包含 2 个主要项目(和常见项目)的解决方案。该体系结构说明了一个非常大的遗留项目,因此无法更改。 主项目是一个 .Net 可执行文件,它的主要 class 继承自 'ServiceBase' class,以便用作 Windows 服务。它定义了 WCF 端点并使用接口 'IWcfXmlServer' 来处理请求。 另一个项目是一个带有 class 的 C++ 项目,它实现了 'IWcfXmlServer' 接口并用于处理请求。
我在本地创建了一个 Windows 服务并将其指向解决方案的 .exe 文件,它工作正常。
下一步是将该应用程序放在 Docker 容器中。 我添加了 Docker 支持,其中添加了 "docker-compose" .yml 文件:
version: '3.4'
services:
wcfservice:
image: ${DOCKER_REGISTRY}wcfservice
build:
context: .\..\WcfService
dockerfile: Dockerfile
和一个Docker文件:
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)