首页 > 解决方案 > .Net Core Web API Docker (Linux) - 无法加载 libMyCpp.so 文件

问题描述

我有一个 .NetCore Web API,并且需要连接一个 C++ 共享库 (libCppAppOutput.so)。为此,我在 Web API 的控制器中使用 DllImport,如下面的代码所示:

[DllImport("libCppAppOutput.so", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "methodNameinCppProject")] 
public static extern int MethodNameInWebAPI(string param1, string param2);

当我在带有 Windows 环境的 Visual Studio 中调试它时,我遇到了一个异常

试图加载格式不正确的程序。(0x8007000B)。

这可能是因为尝试在 Windows 环境中访问 Linux 文件,如果我使用CppAppOutput.dll代替libCppAppOutput.so我可以成功调用 dll 中的方法。但我的实际要求是在 Linux 环境中运行整个应用程序并仅继续使用 .so 文件,因此我创建了一个目标操作系统为 Linux 的 docker 映像,并尝试使用以下命令从运行 docker 调用其中的方法:

docker run -p 8081:80 name_of_docker_image:tagname

然后我得到一个例外,如:

无法加载共享库“libCppAppOutput.so”或其依赖项之一。为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量: libCppAppOutput.so: cannot open shared object file: No such file or directory。

但是我可以使用以下命令看到文件libCppAppOutput.so存在于 docker 映像中,

docker create --name name_of_container name_of_docker_image:tagname
docker start name_of_container 
docker exec -ti name_of_container /bin/bash
root@xyzabc:/app# ls

我正在使用下面的 URL 来测试应用程序

http://localhost:8081/launchUrl/MethodNameInWebAPI/param1/param2

请在这方面帮助我,例如如何从 Linux docker 调用 .so 文件。如果这个问题要详细说明,请发表评论,我会做的。提前致谢。

标签: dockershared-librariesasp.net-core-webapidocker-container.so

解决方案


在同事和朋友的帮助下,我可以解决这个问题。libCppAppOutput.so(一个 XML 解析器)存在依赖关系。即使该依赖包已安装在容器中,但在创建 libCppAppOutput.so 时却错过了配置。这是通过在bash中执行ldl libCppAppOutput.so命令来识别的。

感谢大家花时间阅读和分析问题!拥有更多 N 更棒的编码日!


推荐阅读