从 .net UWP 应用程序使用本机库时诊断 DllNotFoundException
Diagnosing DllNotFoundException when using a native Library from .net UWP app
我在 Windows 开发方面的经验很少,并且 运行 遇到了一些问题。我有一个用 C++ 编写的私有第三方库。我无权访问源代码,并且该库有许多第三方依赖项。问题是我想通过 PInvoke 从 CSharp UWP 应用程序使用此应用程序,但到目前为止我遇到了麻烦。我收到 DLLNotFoundException,我知道如果无法加载库或无法加载它的任何依赖项可能会导致这种情况。
到目前为止我尝试过的:
为了缩小问题范围,我尝试使用常规 C# 控制台应用程序(Windows 表单也有效)。从这个启动项目,我可以按预期调用库上的函数。
使用 CSharp UWP 测试应用:
我已经编译了一个简单的 c++ 测试库,它将两个数字加在一起,并使用它来确保我至少正确地包含了主 DLL。这对我来说很好。我还了解到,对于 UWP 应用程序,必须将 DLL 直接添加到项目中并标记为内容,以便将它们包含在 UWP 包中。我已经这样做了,并确认非 UWP 控制台应用程序可以与相同的 DLL。
所以我的问题是,如何使用相同的配置,Windows console/forms 应用程序可以与库一起使用 - 但 UWP 应用程序不能。这是因为非 UWP 应用程序可以访问比 UWP 应用程序更多的系统 DLL 吗?如果您至少可以帮助我缩小可能的问题范围,那就太好了。如果有一种方法可以找出 UWP 应用程序无法加载哪些库,那就太好了——即使非 UWP 应用程序可以正常加载所有内容。
我正在使用的 UWP 应用程序尚未部署到远程设备。我在本地调试应用程序时遇到问题。注意 - 我无法共享我正在使用的库 - 所以发布测试应用程序是不可能的:(.
感谢您的帮助
哦,我找到了这个具体问题的答案。问题是我还必须复制通过环境变量路径链接的 DLL。我忘记了一些 OpenCV DLL。
还有一些有用的追踪工具:
在我的例子中,我让库从 Windows 库工作,所以我可以使用 "listdll" 工具,它允许您列出在运行时由特定进程加载的 DLL。然后我 运行 在应用程序的 UWP 版本上,在命中断点之后,然后可以粗略地了解哪些 DLL 有点没有加载。我将它与 "pestudio" 结合使用,它允许您查看 .exe 或 DLL 所需的依赖项。
我在 Windows 开发方面的经验很少,并且 运行 遇到了一些问题。我有一个用 C++ 编写的私有第三方库。我无权访问源代码,并且该库有许多第三方依赖项。问题是我想通过 PInvoke 从 CSharp UWP 应用程序使用此应用程序,但到目前为止我遇到了麻烦。我收到 DLLNotFoundException,我知道如果无法加载库或无法加载它的任何依赖项可能会导致这种情况。
到目前为止我尝试过的: 为了缩小问题范围,我尝试使用常规 C# 控制台应用程序(Windows 表单也有效)。从这个启动项目,我可以按预期调用库上的函数。
使用 CSharp UWP 测试应用: 我已经编译了一个简单的 c++ 测试库,它将两个数字加在一起,并使用它来确保我至少正确地包含了主 DLL。这对我来说很好。我还了解到,对于 UWP 应用程序,必须将 DLL 直接添加到项目中并标记为内容,以便将它们包含在 UWP 包中。我已经这样做了,并确认非 UWP 控制台应用程序可以与相同的 DLL。
所以我的问题是,如何使用相同的配置,Windows console/forms 应用程序可以与库一起使用 - 但 UWP 应用程序不能。这是因为非 UWP 应用程序可以访问比 UWP 应用程序更多的系统 DLL 吗?如果您至少可以帮助我缩小可能的问题范围,那就太好了。如果有一种方法可以找出 UWP 应用程序无法加载哪些库,那就太好了——即使非 UWP 应用程序可以正常加载所有内容。
我正在使用的 UWP 应用程序尚未部署到远程设备。我在本地调试应用程序时遇到问题。注意 - 我无法共享我正在使用的库 - 所以发布测试应用程序是不可能的:(.
感谢您的帮助
哦,我找到了这个具体问题的答案。问题是我还必须复制通过环境变量路径链接的 DLL。我忘记了一些 OpenCV DLL。
还有一些有用的追踪工具: 在我的例子中,我让库从 Windows 库工作,所以我可以使用 "listdll" 工具,它允许您列出在运行时由特定进程加载的 DLL。然后我 运行 在应用程序的 UWP 版本上,在命中断点之后,然后可以粗略地了解哪些 DLL 有点没有加载。我将它与 "pestudio" 结合使用,它允许您查看 .exe 或 DLL 所需的依赖项。