无法从 MSIX 打包应用程序加载外部 DLL

Posted

技术标签:

【中文标题】无法从 MSIX 打包应用程序加载外部 DLL【英文标题】:Can't load external DLLs from MSIX packed application 【发布时间】:2022-01-22 22:46:13 【问题描述】:

在普通桌面应用程序中的工作原理

当我们尝试从普通桌面应用程序加载 dll 时,系统会自动检查环境变量“PATH”中指定的目录,最后找到该 dll。例如。我们以这种方式使用 NVidia CUDA dll。

将应用程序打包到 MSIX 中时什么不起作用?

当我们将此应用程序打包到 MSIX 中时,无法再找到 dll,因为打包的应用程序不会检查环境变量“PATH”中指定的文件夹。

在某些情况下,一种解决方法是从代码中动态加载 dll,但它仅在 dll 没有依赖项时才有效。否则加载的 dll 无法找到它的依赖项。

从 MSIX 打包应用程序加载环境变量“path”中定义的路径的 dll 的推荐方法是什么?

平台:Windows 10/11 语言:.NET/C#

【问题讨论】:

【参考方案1】:

您如何知道打包为 MSIX 时找不到 DLL?您是使用 Visual Studio 还是使用 Process Monitor 调试应用程序?

据我所知,打包为 MSIX 的应用程序仍然应该能够从 PATH env var 下列出的文件夹中加载资源。 MSIX 包无法写入 PATH 环境变量,但它安装的应用程序应该能够读取它。

从 MSIX 包加载 DLL 的一个已知问题是当 DLL 位于与 EXE 加载所在的文件夹不同的文件夹中时。但这仅适用于您在包中部署的 DLL,而不适用于机器上其他应用程序安装的 DLL。

MSIX 容器的作用是将资源与 MSIX 包隔离(限制其他应用程序访问它们),但通过 MSIX 部署的应用程序应该能够“看到”机器上存在的所有资源(安装由其他非 MSIX 包),就像任何其他应用程序一样。

【讨论】:

我知道从进程监视器中找不到 DLL。 MSIX 打包应用程序可以从代码中读取 PATH 环境变量。但通常在使用例如DllImport 应用程序检查后续的 PATH 文件夹以查找 DLL 及其依赖项。根据微软的文档docs.microsoft.com/en-us/windows/win32/dlls/…,打包的应用程序不会检查 PATH env var。当 DllImported DLL 试图找到自己的依赖项时,就会出现很大的困难——它们也不检查 PATH env var。

以上是关于无法从 MSIX 打包应用程序加载外部 DLL的主要内容,如果未能解决你的问题,请参考以下文章

如何自动启动使用 Msix 打包的应用程序?

MSIX 未打包所有依赖项

解决pyinstaller打包过程中外部资源无法加载的问题 ...

在 azure 中发布为应用服务后,使用 DinkToPDF 进行 PDF 转换时无法加载外部库“libwkhtmltox.dll”

我可以在 MSIX 包中打包预构建的二进制 exe 吗?

如何使用 MSIX 打包和部署注册表项