c# - 当 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 中。我做了一些测试:
- 我在 DLL2Init() 之前添加了 Dll1Init(),它运行良好。这两个功能正常工作。
- 不要在 Dll2Init() 之前添加 Dll1Init()。将Dll1.dll和Dll2.dll复制到App\bin\x64\Debug\AppX中,也可以正常使用。似乎它从与应用程序而不是库相同的目录(App\bin\x64\Debug\AppX)加载 dll。
- 我调用 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放在同一个目录下。这真的很奇怪。我错过了什么吗?样品在这里
解决方案
推荐阅读
- apache-kafka - 如何从集群版本中删除 kafka 主题:0.10.2.1
- r - 如何在 R 中释放内存系统?
- android - RecyclerView 行为:特定行自定义在其他行上重复(Kotlin)
- c# - 在我的 MVC 应用程序中添加迁移时,什么可能导致我的空对象异常?
- maven - Spring Tool Suite - 3.9.5 - 中央 maven 回购 - 重新索引
- google-chrome - 更改 Chromecast 发件人上的应用 ID
- c# - Unity 预制件作为检查器中的对象要求附加对象
- html - 检测哪一部分被点击?
- ruby - Ruby 和/或 python:将 telnetdata 写入文件
- r - 在 R Plotly 中更改图例标题