.NetCore WebApi, использующий локальный канал Nuget, работает на компьютере windows, но не в контейнере Linux Docker - PullRequest
0 голосов
/ 06 апреля 2020

Я n00b до Docker и Linux Контейнеров. Я программировал в Windows с C# и C ++ в течение многих лет.

У меня есть веб-API, который нуждается в OpenSlide. Для OpenSlide требуется около 20 DLL.

OpenSlide - это родная x64 DLL. Чтобы получить доступ к ее API, я пишу что-то вроде:

[DllImport(@"libopenslide-0.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr openslide_open(string fn);

В Visual Studio for. Net Framework, я бы просто сослался на все библиотеки DLL. , но в. Net Core Мне нужно создать пакет NuGet.

Итак, я сделал это, и мой веб-API работает нормально.

Но я хочу запустить его в Linux hosted Docker container.

Я не знаю, как настроить локальный канал (это одна из проблем), поэтому вот что я сделал:

Я создал файл csproj, который сделал не ссылается на OpenSlide и использовал это при создании Docker image

Я скопировал в DLL-файлы в контейнер в том месте, где они будут в результате RESTORE

После копирования Результаты публикации sh (COPY --from = build / app ./) Я скопировал xxx.deps. json из моего локального выпуска в Docker образ.

Итак (в моем помните) на этом этапе все на изображении Docker должно быть таким же, как если бы я ВОССТАНОВИЛ из локальной ленты NuGet.

* 1 023 * Но когда я запускаюсь, я получаю сообщение об ошибке:
System.DllNotFoundException: Unable to load shared library 'libopenslide-0.dll' or one of its dependencies.

Дополнительная информация (и это, вероятно, суть проблемы):

Итак, я написал простое приложение, которое просто пытается загрузить одну из библиотек DLL (zlib1.dll)

        [HttpGet]
        [Route("zlib")]
        public string GetZlib()
        { 
            var cwd = System.IO.Directory.GetCurrentDirectory();
            var path = System.IO.Path.Combine(cwd, "zlib1.dll");
            System.Reflection.Assembly dll = null;
            try
            {
                dll = System.Reflection.Assembly.LoadFile(path);
            }
            catch( Exception ex )
            {
                return "exception " + ex.Message;
            }
            return ("DLL is " + (dll == null ? "null" : "not null") );
        }

И возвращаемое исключение - "Плохой формат IL"

Таким образом, здесь действительно две проблемы:

(1 ) Почему я получаю формат Bad IL при работе в контейнере Linux? (2) Как использовать локальный канал NuGet при создании контейнера Docker?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...