← Назад

Прошу помощи с контейнеризацией

Здравствуйте!

Написал робота на последней версии S#. Использую Transaq Connector. Пытаюсь завернуть приложение в контейнер Docker. Локально, без контейнера, все работает отлично. Но при попытке соединения в приложении в контейнере выдает ошибку. Приходит exception на событие Connector.ConnectionError:

Error load library txmlconnector.dll. (Parameter 'dllPath')
   at Ecng.Interop.Marshaler.LoadLibrary(String dllPath)
   at Ecng.Interop.DllLibrary..ctor(String dllPath)
   at #=z$v7B9Iu3PqOtBWiwGjTeuTIBQG7A..ctor(String #=zWUnOCRY=, #=zGon05jN$zqu0 #=z$SosFX8=)
   at #=zfFAR89tKbzSwRbMRwZT08jN8htD7UjYzvw==..ctor(Action`1 #=z$SosFX8=, Action`1 #=zuVX1g4Bj32l1, String #=zWUnOCRY=, Boolean #=z1BrZqexflzIZ, Boolean #=zpNZ3xedpXleK, String #=zEYFvlw2lUDMt, ApiLogLevels #=z9eSLFMNKlQa7)
   at StockSharp.Transaq.TransaqMessageAdapter.#=zAxO2KDE=()
   at StockSharp.Transaq.TransaqMessageAdapter.OnSendInMessage(Message message)
   at StockSharp.Messages.MessageAdapter.SendInMessage(Message message)

Dockerfile стандартный:


FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR C:/app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR C:/src
COPY ["OrdersExecutor.csproj", ""]
RUN dotnet restore "./OrdersExecutor.csproj"
COPY . .
WORKDIR "C:/src/."
RUN dotnet build "OrdersExecutor.csproj" -c Release -o C:/app/build

FROM build AS publish
RUN dotnet publish "OrdersExecutor.csproj" -c Release -o C:/app/publish

FROM base AS final
WORKDIR C:/app
RUN dir
COPY --from=publish C:/app/publish .
ENTRYPOINT ["dotnet", "OrdersExecutor.dll"]

Пробовал запускать на разных runtime (nano, core), не помогает. Код, собранный в конейнере (и выдернутый из него), запускается на локальной машине отлично. Т.е. проблема именно в среде выполнения и методе загрузки txmlconnector.dll. Исходников Ecng.Interop, чтобы подсмотреть, у меня нет и я не знаю куда копать. Помогите!

Комментарии (5)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Павел
Павел Автор

Автора первого полезного ответа ждет вознаграждение.

Sprite
Sprite

Такая же ошибка возникает если завернуть приложение в UWP Попробуйте жестко задать путь к txmlconnector.dll https://doc.stocksharp.ru/html/P_StockSharp_Transaq_TransaqMessageAdapter_DllPath.htm

Павел
Павел
Павел Автор

sprite: Такая же ошибка возникает если завернуть приложение в UWP Попробуйте жестко задать путь к txmlconnector.dll https://doc.stocksharp.ru/html/P_StockSharp_Transaq_TransaqMessageAdapter_DllPath.htm

Спасибо за наводку!

Но не помогло. Попробовал принудительно задать абсолютный и относительные пути, разные варианты с косыми и прямыми чертами, пробовал заранее копировать dll в контейнер. Не помогло :(.

Sprite
Sprite

Еще может надо копать в сторону Docker + C++ MSVC, так как есть подозрение что transaqxml.dll это использует. https://devblogs.microsoft.com/cppblog/using-msvc-in-a-docker-container-for-your-c-projects/ Но я не знаю и сам не пробовал.

Павел
Павел
Павел Автор

Кстати, я даже попробовал установить все версии vcredist в контейнер, не помогло.