Я 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?