无法从 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的主要内容,如果未能解决你的问题,请参考以下文章
解决pyinstaller打包过程中外部资源无法加载的问题 ...
在 azure 中发布为应用服务后,使用 DinkToPDF 进行 PDF 转换时无法加载外部库“libwkhtmltox.dll”