【问题标题】:Windows service in C# + C++ is refusing to start in DockerC# + C++ 中的 Windows 服务拒绝在 Docker 中启动
【发布时间】:2018-06-04 06:12:02
【问题描述】:

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

我在本地创建了一个 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"]

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

无法从命令行或调试器启动服务。必须先安装 Windows 服务(使用 installutil.exe),然后使用 ServerExplorer、Windows 服务管理工具或 NET START 命令启动。

但仍然会创建容器。

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

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

EntryType : 错误 消息:服务无法启动。 System.Reflection.TargetInvocationException:调用的目标已引发异常。 ---> System.IO.FileNotFoundException:无法加载文件或 程序集“testole.dll”或其依赖项之一。指定的模块无法找到。 在 WcfService.WcfXmlServerFacade..ctor() --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数,签名 sig,布尔构造函数) 在 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 System.ServiceModel.Description.ServiceDescription.CreateImplementation(类型 serviceType) 在 System.ServiceModel.Description.ServiceDescription.SetupSingleton(ServiceDescription serviceDescription, 对象实现, Boolean isWellKnown) 在 System.ServiceModel.Description.ServiceDescription.GetService(类型 serviceType) 在 System.ServiceModel.ServiceHost.CreateDescription(IDictionary`2& 实现... 来源:WcfService1

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

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

提前致谢。

【问题讨论】:

  • 如消息所述,testole.dll 本身可以引用其他不可用的程序集(并递归地)。
  • @SimonMourier - 检查的好方向。我在 C++ dll 中的一个文件中有:#using <mscorlib.dll> #using <System.dll>。我会试着弄清楚,稍后会更新。
  • 这两个应该在这里,它们是 .net 框架的核心。查看 c++ 项目的外部库(.lib、.a)。或者您也可以直接在 .dll 或 .exe 上使用“依赖”工具 dependencywalker.com
  • @SimonMourier 。谢谢你的帮助。我仍然无法弄清楚是什么问题。我已经尝试过该工具,但它无法解决所有依赖关系,而且它太乱了。当我尝试在 Docker 中启动服务时,有没有办法获得有关异常的更多信息?
  • 我对 docker 一无所知,但我想可能有一些组件通常在每个 Windows 上都有,而不是在你的 docker 环境中。

标签: c# c++ wcf docker managed-c++


【解决方案1】:

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

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多