2013-10-02 55 views
1

我在vs2010(.net 4.0)中提出申请。我使用发布者和InstallShield LE发布了它。找不到DLL文件(非COM对象)

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

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

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

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

谢谢。

+0

包装DLL不是我的个人代码。它是非托管库的托管版本。我必须将非托管dll粘贴到bin文件夹才能使调试器正常工作。 – Naresh

回答

1

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

解决问题的建议方法是简单地将DLL放在与可执行文件相同的目录中。当加载的DLL尝试定位DLL时,首先搜索可执行文件所在的目录。这是放置原生DLL的最安全的地方。

如果由于某种原因,你不能把DLL中的可执行文件的目录,还有其他选择:

  • 呼叫SetDllDirectory与您的DLL的目录使您第一的P/Invoke调用之前。当该呼叫返回时,呼叫SetDllDirectory传递NULL以恢复默认的DLL搜索顺序。
  • 在进行第一次p/invoke调用之前,使用DLL的完整路径明确调用LoadLibrary。一旦DLL被加载,将来的p/invoke调用将使用已经加载的模块。
+0

非常感谢。现在我进行了管理,稍后我会研究更多细节。 – Naresh

0

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

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

只要您在使用任何DLL方法之前成功调用LoadLibrary,就会在DLL已经加载时成功。

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