1

vs2010我在(.net 4.0)中提出了申请。我使用发布者和 InstallShield LE 发布了它。

但是当我运行应用程序时,我得到一个dll找不到的错误。我知道缺少哪个 dll。这是一个非 COM 对象,我无法将它添加到我在 vs2010 中的项目中。我正在使用调用此 dll 的包装库。

如果我将其粘贴到dllsyswow64,我的应用程序可以正常工作。但我想要一种更清洁的方式。我已经在这里查看了汉斯的答案。但我不知道什么是并行缓存。

添加环境变量的路径也可以。

我不确定更新注册表和添加路径值是否有效。我想知道我是否可以为我的应用程序更新注册表并指导它搜索特定 dll 的路径。

谢谢。

4

2 回答 2

1

修改用户PATH变量是一个非常重量级的解决方案,您应该避免这种情况。同样,不要将 DLL 放在系统目录中。这属于系统,对您来说是私有的。

解决问题的推荐方法是将 DLL 与可执行文件放在同一目录中。当加载的文件试图定位 DLL 时,首先搜索可执行文件所在的目录。这是放置本地 DLL 最安全的地方。

如果由于某种原因不能将 DLL 放在可执行目录中,还有其他选择:

  • SetDllDirectory在进行第一次 p/invoke 调用之前使用 DLL 的目录进行调用。当该调用返回时,调用SetDllDirectory传递NULL以恢复默认的 DLL 搜索顺序。
  • LoadLibrary在进行第一次 p/invoke 调用之前,使用 DLL 的完整路径进行显式调用。加载 DLL 后,未来的 p/invoke 调用将使用已加载的模块。
于 2013-10-02T09:50:02.967 回答
0

如果事先知道 DLL 名称,有一个简单的方法。

您可以简单地使用 LoadLibrary 从其已知位置加载 DLL(例如基于配置文件条目)。

只要您在使用任何 DLL 方法之前成功调用 LoadLibrary,这将成功,因为 DLL 已经加载。

这是有效的,因为您可以使用完整路径 LoadLibrary,并且一旦完成,随后仅使用文件名调用 LoadLibrary 将立即成功,因为该库已经加载。

于 2013-10-02T09:51:08.417 回答