【问题标题】:dll not found (non COM object)找不到 dll(非 COM 对象)
【发布时间】:2013-10-08 15:20:45
【问题描述】:

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

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

如果我将 dll 粘贴到 syswow64 中,我的应用程序可以正常工作。但我想要一种更清洁的方式。我已经看过汉斯的回答here。但我不知道什么是并行缓存。

向环境变量添加路径也可以正常工作。

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

谢谢。

【问题讨论】:

  • Wrapper dll 不是我的个人代码。它是非托管库的托管版本。我必须将非托管 dll 粘贴到 bin 文件夹中才能使调试器工作。

标签: c# visual-studio-2010 dll com registry


【解决方案1】:

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

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

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

  • 在进行第一次 p/invoke 调用之前,使用 DLL 的目录调用 SetDllDirectory。当该调用返回时,通过 NULL 调用 SetDllDirectory 以恢复默认的 DLL 搜索顺序。
  • 在进行第一次 p/invoke 调用之前,使用 DLL 的完整路径显式调用 LoadLibrary。加载 DLL 后,未来的 p/invoke 调用将使用已加载的模块。

【讨论】:

  • 非常感谢。目前我已经掌握了,稍后我会研究更多细节。
【解决方案2】:

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

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

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

之所以可行,是因为您可以使用完整路径 LoadLibrary,一旦完成,后续仅使用文件名调用 LoadLibrary 将立即成功,因为该库已加载。

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 2012-09-22
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多