链接子文件夹中的dll

时间:2015-09-15 07:09:21

标签: c# c++ dll

我为一些未管理的dll(OpenCV)编写了一个C ++ / CLI包装器。到目前为止,一切正常。现在我想将dll存储在子文件夹中,因此最终的应用程序结构如下所示:

bin\
    MainApp.exe
    wrapper.dll
    Wrapper\library1.dll
    Wrapper\library2.dll

另外,我想在Wrapper项目中进行配置,所以我不需要在使用wrapper.dll的任何其他项目中关心这个

我发现有几个帖子在讨论这个问题,但似乎没有一个符合我的需求:

  • 在app.config文件中设置路径:wrapper.dll没有 app.config文件,我必须在每个中添加此引用 使用dll的可执行项目。
  • 设置AppDomainSetup.PrivateBinPath:这可能是一种解决方法,但我是 不确定它是否适用于非托管dll。
  • 使用ILMerge:它是否适用于非托管dll以及C ++ / CLI dll?

理想情况下,我在项目设置中寻找属性来添加此子文件夹,因此包含我的项目的每个解决方案都将在右侧文件夹中查找非托管dll。

1 个答案:

答案 0 :(得分:1)

这里的问题是DLL通常由Windows加载,并且在应用程序启动时会重新加载它们。 Windows首先查看EXE,找到它需要的DLL,加载它们,然后继续加载DLL所需的DLL。这不是特定于C ++或C#。

.Net确实会影响DLL加载,但这不适用于本机DLL。

那么,你能做什么?一种解决方案是让Windows加载你的DLL。 Visual Studio有DelayLoad选项。这在运行时使用LoadLibrary。使用dliNotePreLoadLibrary,您可以控制从哪里加载。由于这是在运行时从您的DLL发生的,因此可执行文件不需要执行任何操作。