就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提要?