c# - 从子文件夹链接 dll

标签 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。

最佳答案

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

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

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

关于c# - 从子文件夹链接 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32579813/

相关文章:

c# - 创建对象与直接从数据库中选择

c# - 检测 Async/Await 的滥用 : Prevent blocking calls

c++ - 编写从C++应用程序链接的Delphi DLL:访问C++接口(interface)成员函数会导致访问冲突

c# - 如何解决 "Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types"Android 错误?

c# - WPF XAML 合并默认命名空间定义

c# - 在这种情况下警告 CS3006 有效吗?

c++ - 如何从 EigenBase 构建动态数组?

C++循环构造依赖: class constructors taking a pointer to each other

c++ - 为什么 condition_variable 不是 MoveAssignable

java - 线程 "main"java.lang.UnsatisfiedLinkError 中的异常