Служба Windows в C # + C ++ отказывается запускаться в Docker - PullRequest
0 голосов
/ 04 июня 2018

Я создал решение в VS 2017 с двумя основными проектами (и обычными).Архитектура иллюстрирует очень большой устаревший проект, поэтому не может быть изменен.Основной проект - это исполняемый файл .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.

, но контейнер все равно создается.

Я открыл PowerShell в созданном контейнере Docker и использовал «New-Service», чтобы создать новый сервис и указать его на мой файл .exe.Когда я пытаюсь запустить Start-Service, я получаю сообщение об ошибке.

Я использовал журнал событий Windows, чтобы получить описание ошибки:

EntryType: Сообщение об ошибке: Невозможно запустить службу.System.Reflection.TargetInvocationException: исключение было сгенерировано целью вызова.---> System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'testole.dll' или одну из ее зависимостей.Указанный модуль не может быть найден.в WcfService.WcfXmlServerFacade..ctor () --- Конец трассировки стека внутренних исключений --- в System.RuntimeMethodHandle.InvokeMethod (аргументы объекта, аргументы Object [], сигнатура сигнатуры, логический конструктор) в System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, связыватель Binder, параметры Object [], культура CultureInfo) в System.ServiceModel.Description.ServiceDescription.CreateImplementation (Тип serviceType) в System.ServiceModel.Description.ServiceDescription.SetupSingleton (реализация объекта ServiceWellWessing)System.ServiceModel.Description.ServiceDescription.GetService (тип serviceType) в System.ServiceModel.ServiceHost.CreateDescription (IDictionary`2 & Implem ... Источник: WcfService1

  • 'testole.dll' являетсяМой c ++ проект скомпилирован. ** Я уже проверил, что «testole.dll» присутствует в том же каталоге файла .exe внутри контейнера.

Я не могу понять ни, почему это не удаетсявзапустить DLL C ++, ни как получить больше информации об ошибке (Console.Writeine ​​() \ Debug.Writeine ​​()) по какой-то причине не работает.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

Скорее всего, вам не хватает распространяемого пакета Visual C ++.Я подозреваю, что он не установлен по умолчанию на образах окон Windows.

Попробуйте добавить следующие строки (для загрузки 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)

...