找不到DLL(非COM对象)

时间:2013-10-02 09:12:49

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

我在vs2010(.net 4.0)中创建了一个应用程序。我使用发布者和InstallShield LE发布了它。

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

如果由于某种原因你无法将DLL放在可执行文件目录中,还有其他选择:

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

答案 1 :(得分:0)

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

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

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

这是有效的,因为你可以使用完整路径加载LoadLibrary,一旦完成,只需文件名的LoadLibrary后续调用将立即成功,因为库已经加载。