【发布时间】:2018-07-04 12:36:49
【问题描述】:
在 windowsservercore Docker 容器上的 C# .NET 核心应用程序中使用本机 C++ DLL 时遇到问题。尝试使用 C# .NET Core 应用程序中的 pInvoke 从本机 DLL 调用公开的 API 时出现以下错误。
错误:无法加载 DLL“MyDLL”:找不到指定的模块。 (HRESULT 异常:0x8007007E)
问题:我的 windows docker 容器(从 windowsservercore 基础映像构建)有一个 C# .net 核心服务在特定的 POST 请求上运行.. 我需要从本机 C++ DLL 调用函数,我正在使用 pInvoke 调用它。现在的问题是本机 DLL 没有加载,因为容器映像中缺少它的一些依赖项。我尝试安装可能的 VC++ 可再发行组件 ..但它没有解决问题。所以在检查完整的依赖关系树时(使用依赖项walker ) 我开始知道 windowsservercore 基础 docker 映像中缺少一些系统库。 以下是 docker 容器中缺少的一些库的列表。
c:\windows\system32\ELSCORE.DLL
c:\windows\system32\DEVMGR.DLL
c:\windows\system32\DCOMP.DLL
c:\windows\system32\DSREG.DLL
c:\windows\system32\SHDOCVW.DLL
c:\windows\system32\COREUICOMPONENTS.DLL
c:\windows\system32\POLICYMANAGER.DLL
c:\windows\system32\OPENGL32.DLL
所以我的问题是,如何解决那些系统级库对容器的依赖?我知道出于明显的原因(最小化图像大小),这些库被排除在基本 windowsservercore docker 图像之外。但是有没有任何标准的方式/安装程序/软件包可以将缺少的系统库安装到我的 docker 映像中?还是我应该手动将所有必需的库复制到 system32 文件夹
PS:安装 VC++ 可再发行组件后,相同的代码在主机(Windows Server 2016)上工作,只是它不能在 windowsservercore Docker 容器上工作(即使在安装了提到的 VC++ 可再发行组件之后)。
谢谢, -苛刻
【问题讨论】:
-
您可以尝试新的完整Windows镜像theregister.co.uk/2018/06/28/…
-
谢谢,但是为了使用这个内部 docker 镜像。我们也应该在主机上使用最新的内部构建操作系统,我认为在我们的情况下这不是合适的解决方案。所以我认为我们应该等待 Windows 发布支持更多功能的新 docker 镜像。
-
是的,但这会让您在了解您的功能在该图像中是否可以使用方面领先一步
-
谢谢@GregorySuvalian ..我会试试这个..你知道亚马逊或Azure AMI预装了最新的windows server Insider构建吗?还是我们需要在本地尝试(可能在虚拟机上)?
-
我不相信任何云提供商都在运行内幕图片
标签: c++ windows docker dll docker-for-windows