如何安装在 windowsservercore Docker 映像上执行本机 C++ DLL/EXE 所需的所有依赖二进制文件
Posted
技术标签:
【中文标题】如何安装在 windowsservercore Docker 映像上执行本机 C++ DLL/EXE 所需的所有依赖二进制文件【英文标题】:How to install all dependent binaries required to execute native C++ DLL/EXE on windowsservercore Docker image 【发布时间】: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构建吗?还是我们需要在本地尝试(可能在虚拟机上)? 我不相信任何云提供商都在运行内幕图片 【参考方案1】:目前,使用当前发布的 Windows Server Docker 映像,您无法执行依赖于上述系统库的本机二进制文件。为了在已发布的 windows server docker 容器上工作,我们必须等待下一个 windows docker 映像(占用空间大且可用的功能更多)发布。
【讨论】:
我也遇到了同样的问题……你的回答还有效吗?那些较新的图像已经发布了吗?以上是关于如何安装在 windowsservercore Docker 映像上执行本机 C++ DLL/EXE 所需的所有依赖二进制文件的主要内容,如果未能解决你的问题,请参考以下文章
在WinSrv 2016 Core模式下安装Exchange Server 2019预览版
SQL Server Docker 容器能否在 Windows Server core 2022 上运行(“linux”不能在此平台上使用)