我在 windowsservercore Docker 容器上的 C# .NET core 应用程序中使用 native C++ DLL 时遇到问题。尝试使用 C# .NET Core 应用程序中的 pInvoke 从 native DLL 调用公开的 API 时出现以下错误。
错误:无法加载 DLL“MyDLL”:找不到指定的模块。 (HRESULT 异常:0x8007007E)
问题:我的 Windows docker 容器(从 windowsservercore 基础镜像构建)有一个 C# .net core 服务在特定的 POST 请求上运行..我需要从 native C++ DLL 调用函数,我使用 pInvoke 调用它。现在的问题是 native DLL 未加载,因为容器镜像中缺少它的一些依赖项。我尝试安装可能的 VC++ 可再发行组件。但它不能解决问题。所以在检查完整的依赖项树时(使用依赖项遍历器) )我发现 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 服务器 docker 镜像,您无法执行依赖于上述系统库的 native 二进制文件。为了使其能够在已发布的 Windows 服务器 docker 容器上运行,我们必须等待下一个 Windows docker 镜像(占用空间大且可用的功能更多)的发布。
关于c++ - 如何安装在 windowsservercore Docker 镜像上执行 native C++ DLL/EXE 所需的所有依赖二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51173889/