我为一些未管理的dll(OpenCV)编写了一个C ++ / CLI包装器。到目前为止,一切正常。现在我想将dll存储在子文件夹中,因此最终的应用程序结构如下所示:
bin\
MainApp.exe
wrapper.dll
Wrapper\library1.dll
Wrapper\library2.dll
另外,我想在Wrapper项目中进行配置,所以我不需要在使用wrapper.dll的任何其他项目中关心这个
我发现有几个帖子在讨论这个问题,但似乎没有一个符合我的需求:
理想情况下,我在项目设置中寻找属性来添加此子文件夹,因此包含我的项目的每个解决方案都将在右侧文件夹中查找非托管dll。
答案 0 :(得分:1)
这里的问题是DLL通常由Windows加载,并且在应用程序启动时会重新加载它们。 Windows首先查看EXE,找到它需要的DLL,加载它们,然后继续加载DLL所需的DLL。这不是特定于C ++或C#。
.Net确实会影响DLL加载,但这不适用于本机DLL。
那么,你能做什么?一种解决方案是不让Windows加载你的DLL。 Visual Studio有DelayLoad
选项。这在运行时使用LoadLibrary
。使用dliNotePreLoadLibrary
,您可以控制从哪里加载。由于这是在运行时从您的DLL发生的,因此可执行文件不需要执行任何操作。