首页 > 解决方案 > 当 C#(UWP) 调用调用另一个 dll 的本机 c++ dll 时“无法加载 DLL”

问题描述

我有一个 UWP c# 应用程序,它调用一个名为 DLL2.dll 的本机 C++ DLL,而 DLL2.dll 调用另一个名为 DLL1.dll 的本机 C++ DLL。我将这两个 dll 放入名为 library 的文件夹中,UWP 项目包含此文件夹,在“复制到输出目录”中选择“始终复制”,在“构建操作”中选择“内容”。在 .cs 文件中:(Dll2Init 将调用 Dll1Init)

    [DllImport("library/Dll1.dll", EntryPoint = "DLL1Init", CharSet = CharSet.Unicode)]
    public static extern void DLL1Init();
    
    [DllImport("library/Dll2.dll", EntryPoint = "DLL2Init", CharSet = CharSet.Unicode)]
    public static extern void DLL2Init();//this function will call DLL1Init()

    public MainPage()
    {
        this.InitializeComponent();
        //DLL1Init();//will run well call DLL1Init before Dll2Init
        DLL2Init();
    }

当我运行 c# 时,它显示“无法加载 DLL 'library/Dll2.dll' 或其依赖项之一:找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)”。我检查了 Dll1.dll 和 Dll2.dll 已经复制到 App\bin\x64\Debug\AppX\library 中。我做了一些测试:

  1. 我在 DLL2Init() 之前添加了 Dll1Init(),它运行良好。这两个功能正常工作。
  2. 不要在 Dll2Init() 之前添加 Dll1Init()。将Dll1.dll和Dll2.dll复制到App\bin\x64\Debug\AppX中,也可以正常使用。似乎它从与应用程序而不是库相同的目录(App\bin\x64\Debug\AppX)加载 dll。
  3. 我调用 Dll1Init(),它在 App\bin\x64\Debug\AppX 中没有 DLL1.dll 时运行良好,这意味着它从 App\bin\x64\Debug\AppX\library 加载 Dll1.dll。

从上面可以看出,当应用程序调用不调用其他第三方 dll 的 dll 时,dll 可以在任何目录中,以防它 DllImport 它。但是如果c++ dll调用了另一个Dll,这些DLL只能和app放在同一个目录下。这真的很奇怪。我错过了什么吗?样品在这里

标签: c#c++dlluwp

解决方案


推荐阅读