2013-10-02 94 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時只需要文件名就會立即成功,因爲庫已經加載。