是否可以在Windows docker容器中运行的dotnet核心应用程序中使用EPPlus?

时间:2019-01-23 14:38:26

标签: c# docker .net-core gdi+ epplus

我有一个dotnet core 2.1 Web API,该API的操作会生成一个.xlsx电子表格。它创建一个FileStreamResult,浏览器随后可以处理。生成电子表格的代码如下:

using (var excelFile = new ExcelPackage())
using (var worksheet = excelFile.Workbook.Worksheets.Add("Sheet 1"))
{
    ...
    //insert data into worksheet

    return new FileStreamResult(new MemoryStream(excelFile.GetAsByteArray()), "application/octet-stream") { FileDownloadName = "Report.xlsx" };
}

将其托管在IIS中可以正常工作,并将生成电子表格。 当我将应用程序专门托管在Windows docker容器中时,图像:microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016在尝试生成报告时出现以下异常:

  

System.TypeInitializationException:“ Gdip”的类型初始值设定项   引发了异常。 ---> System.DllNotFoundException:无法加载   DLL'gdiplus.dll'

经过一番研究,我发现在纳米服务器图像中不存在gdiplus。

是否可以使用EPPlus在nanoserver映像中托管的dotnet核心应用程序上创建电子表格?还是我必须使用另一个库来生成xlsx?如果可能的话,我想使用EPPlus。我不能使用linux容器(不幸的是现在还是这样)

2 个答案:

答案 0 :(得分:1)

我不知道它是否可以工作,但是尝试注释掉使用struct Properties { static int roll; static std::string name; static std::vector<std::string> vec; }; int Properties::roll = 1; std::string Properties::name{}; std::vector < std::string > vec; int main() { Properties::roll = 1; Properties::name = "Jack"; Properties::vec.push_back("Hellooooo"); // unresolved external symbol "public: static class return 0; } 的库中的任何方法,例如System.Drawing.Common。这就是导致它在我的linux容器上损坏的原因。

答案 1 :(得分:0)

您可以构建自己的ubtuntu / dotnetcore映像!我只是自己解决了这个问题。

从命令行:

docker pull ubuntu

docker run -t -t ubuntu:latest /bin/bash -> to open a container shell ->

    apt-get update

    apt-get install wget    

    wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

    dpkg -i packages-microsoft-prod.deb

    apt-get install apt-transport-https

    apt-get update

    apt-get install dotnet-sdk-2.2

在此处安装解决库System.Drawing / EPPlus问题所需的特殊库:

    apt-get install libgdiplus

    cd /usr/lib

    ln -s libgdiplus.so gdiplus.dll

    apt-get install libc6-dev libx11-dev

    rm -rf /var/lib/apt/lists/*

命令行窗口中找到容器进程ID并提交映像:

docker ps 


    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    4975113bb79        ubuntu:latest       "/bin/bash"         9 minutes ago       Up 9 minutes                            infallible_poincare

docker commit d497 custom/imagename:dotnetcore-2.2-custom

docker ps kill d497

docker image rm ubuntu

现在,您有了一个自定义的ubuntu映像(dotnetcore使用的同一映像),其中已加载了sdk以及停止错误所需的库。

该图像可能会被修剪掉,请注意,这是我第一次成功解决此问题的尝试,由于公司防火墙的限制,在网上我发现其他方法均未成功。