我已经为一些非托管 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/