英特尔可再发行组件的DLL地狱

时间:2016-01-28 09:07:15

标签: c++ windows dll manifest redistributable

我们的一些用户一直在抱怨我们的插件加载时发现 libmmd.dll 错误。

一些背景知识:

  • 我说的是 Windows 上发生的问题(8,就此而言)。
  • 我们开发数字音频工作站的插件(用于数字声音) 处理目的)。
  • 我们的插件是在VS2012中编码的 DLL ,并通过调用 icl.exe的Perl脚本使用 Intel Compiler 2015 进行编译 来自cmd
  • 其中一个依赖项是英特尔提供的数学 图书馆提供了 2015年可再分发的风味(我们的 与我们的插件一起安装,名为 libmmd.dll

为方便起见,让我们调用插件DLL plugin.dll (!!!)。

我没有太多时间在受影响的用户的计算机上,但从我看到的情况来看,重新安装英特尔的可再发行组件包没有帮助,只将libmmd.dll移动到与plugin.dll相同的文件夹。

无论出现这种(突然和意外)行为的原因,我们希望能够提供针对此类问题的保护软件( DLL Hell )。

我们想要的是 plugin.dll首先在特定目录中查找库(可配置甚至更好),然后是通常的search order

我尝试使用清单注册表库名称链接器选项 ... 唯一真正有用的是用切换 / MD选项(但是使用静态库重新编译确实增加了plugin.dll的大小)并将库复制到plugin.dll文件夹中

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

SetDllDirectory功能允许您添加DLL搜索顺序的文件夹路径。它将被添加到第二位,紧跟在程序文件夹本身后面。

这仅影响通过if (cboAssignTo != null) { GetUsers(); cboAssignTo.DataSource = GetActiveUsers(dstAuthUsrList).Tables[0]; cboAssignTo.DataBind(); // Add this statement ListItem lstItm = new ListItem("New", ""); cboAssignTo.Items.Insert(0, lstItm); } 加载的DLL;如果您的DLL是静态加载的,它将没有任何区别。