我在vs2010
(.net 4.0)中创建了一个应用程序。我使用发布者和InstallShield LE发布了它。
但是当我运行应用程序时,我收到错误,即找不到dll
。我知道哪个dll丢失了。这是一个非COM对象,我无法将其添加到vs2010中的项目中。我正在使用一个调用此dll的包装器库。
如果我将dll
粘贴到syswow64
中,我的应用程序运行正常。但我想要一种更清洁的方式。我已经看过汉斯的回答here。但我不知道什么是并排缓存。
添加环境变量的路径也可以正常工作。
我不确定更新注册表和添加路径值是否有效。我想知道我是否可以更新我的应用程序的注册表并指导它搜索特定dll的路径。
感谢。
答案 0 :(得分:1)
修改用户的PATH
变量是一个非常重要的解决方案,你应该避免这种情况。同样,不要将DLL放在系统目录中。这属于系统,对您来说是私密的。
解决问题的推荐方法是将DLL放在与可执行文件相同的目录中。当加载的尝试查找DLL时,首先搜索可执行文件所在的目录。这是放置本机DLL的最安全的地方。
如果由于某种原因你无法将DLL放在可执行文件目录中,还有其他选择:
SetDllDirectory
。当该调用返回时,调用SetDllDirectory
传递NULL
以恢复默认的DLL搜索顺序。LoadLibrary
。加载DLL后,将来的p / invoke调用将使用已加载的模块。答案 1 :(得分:0)
如果您事先知道DLL名称,则有一种简单的方法。
您可以简单地使用LoadLibrary从其已知位置加载DLL(基于例如配置文件条目)。
只要您在使用任何DLL方法之前成功调用LoadLibrary,这将成功,因为DLL已经加载。
这是有效的,因为你可以使用完整路径加载LoadLibrary,一旦完成,只需文件名的LoadLibrary后续调用将立即成功,因为库已经加载。