【发布时间】: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++