使用本地Nuget提要的.NetCore WebApi可在Windows计算机上工作,但不能在Linux Docker容器中工作

时间:2020-04-06 15:58:17

标签: c# linux docker .net-core

就Docker和Linux容器而言,我是n00b。我已经在Windows中使用C#和C ++进行编程多年。

我有一个需要OpenSlide的Web API。 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托管的Docker容器中运行它。

我不知道如何设置本地供稿(这是一个问题),所以这就是我所做的:

我创建了一个不引用OpenSlide的csproj文件,并在构建Docker映像时使用了该文件

我将DLL文件中的DLL文件复制到了容器中,由于还原的原因,容器将位于该位置

在复制发布结果(COPY --from = build / app ./)之后,我将本地发行版中的xxx.deps.json复制到了Docker映像中。

因此(在我看来),此时Docker映像中的所有内容都应与从本地NuGet提要中还原的内容相同。

但是当我跑步时,出现错误:

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)在Linux容器中运行时为什么会出现错误的IL格式? (2)在制作Docker容器时如何使用本地NuGet提要?

0 个答案:

没有答案