2010-12-07 50 views
4

我有一個簡單的控制檯測試應用程序,ConsoleApplication1.exe,其中引用另一個程序集clipper.dll爲什麼我的應用程序不能在同一個目錄中找到一個依賴的dll?

在我測試過的3臺機器上,可以將兩個文件放在例如c:\test\,並執行ConsoleApplication1.exe

在一個其它機器,這恰好是一個客戶機上,運行ConsoleApplication1.exe結果在程序崩潰和以下被打印到控制檯:

C:\test>dir 
Volume in drive C has no label. 
Volume Serial Number is 7C46-414F 

Directory of C:\test 

07/12/2010 06:08 PM <DIR>   . 
07/12/2010 06:08 PM <DIR>   .. 
07/12/2010 05:13 PM   11,776 ClassLibrary1.dll 
07/12/2010 05:13 PM   30,208 ClassLibrary1.pdb 
07/12/2010 04:55 PM    3,572 ClassLibrary1.tlb 
19/11/2010 02:46 PM   235,008 clipper.dll 
19/11/2010 02:46 PM   1,534,976 clipper.pdb 
07/12/2010 05:13 PM    6,144 ConsoleApplication1.exe 
07/12/2010 05:13 PM   11,776 ConsoleApplication1.pdb 
01/08/2010 12:52 PM   139,264 nunit.core.dll 
01/08/2010 06:41 AM   57,344 nunit.core.interfaces.dll 
01/08/2010 06:41 AM   135,168 nunit.framework.dll 
01/08/2010 06:41 AM   547,262 nunit.framework.xml 
       11 File(s)  2,712,498 bytes 
       2 Dir(s) 477,821,784,064 bytes free 

C:\test>ConsoleApplication1.exe 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass 
embly 'clipper.dll' or one of its dependencies. The specified module could not b 
e found. 
    at ConsoleApplication1.Program.Main(String[] args) 

這是一個奇對我來說,雖然我不不理解dll全面加載規則我以爲它會在CWD中搜索指定的文件。而且這個設置在我嘗試過的其他各種電腦上的工作原理也很奇怪。

奇怪的是,如果我刪除clipper.dll然後工作計算機上運行它:

C:\Temp>ConsoleApplication1.exe 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass 
embly 'clipper, Version=1.0.3975.26584, Culture=neutral, PublicKeyToken=null' or 
one of its dependencies. The system cannot find the file specified. 
    at ConsoleApplication1.Program.Main(String[] args) 

未處理的異常是稍有不同,一個完整的程序集名稱。

  • 兩個ConsoleApplication1.execlipper.dll針對.NET 4
  • 內置所有機器都安裝了.NET 4運行。問題機器沒有.NET sdk clipper.dll是ummanaged C++代碼和C++/CLI的組合。這是一個可疑的角色,因爲它基本上是我創建的第一個C++/CLI .NET程序集,涉及到很多摸索。它似乎加載在反射器罰款。
  • 當我試圖找出爲什麼我無法成功利用一個COM對象(稱爲foo.dll)時,這些努力的結果也是如此,它也引用了clipper.dll--所有這些也都在相同的問題機器上。經過幾個小時的地獄之後,我能夠進一步將其隔離。
+0

也從安裝文件夾中刪除pdbs – TalentTuner 2010-12-07 08:46:38

回答

10

或其依賴

你部署機上CRT runtime DLLs之一嗎?確保部署組件的發佈版本。 CRT的調試版本不可再發行。

+0

我不明白'可再發行'。微軟經常在他們的下載頁面中使用這個術語。它是什麼? '可再發行組件包'和'不可再發行組件'有什麼區別?請給我一個提示。 – Benjamin 2010-12-07 09:54:45

1

我不知道爲什麼會發梗到u,但如果你將複製DLL來system32目錄下會導致2選項 1)將工作 2)它不會工作,這樣你就會知道它不涉及dll路徑

0

好,可能會有很多理由

這些努力出來時,我試圖找出爲什麼我無法成功地利用COM對象(稱爲foo.dll),它也引用了clipper.dll - 所有這些也都在同一臺機器上。經過幾個小時的地獄之後,我能夠進一步將其隔離。

是在故障電腦上註冊的COM對象(foo.dll)嗎?

也請從安裝文件夾中刪除pdbs。

0

您的應用程序文件是從網上下載的嗎?我曾經遇到同樣的問題,我的程序被下載到一個zip文件中,然後在客戶機上解壓。一旦提取出來,我得到完全相同的錯誤信息「指定的模塊不能發現」 。

原來是從互聯網下載的文件的Windows安全策略。 Windows將「阻止」下載的文件,並且需要手動解除阻止。在我的情況下,我需要右鍵單擊文件,選擇屬性,然後選擇「解鎖」,然後我的應用程序才能正常加載程序集。

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=mpe&DownloadId=163767

另外,您可以提取它之前解鎖zip文件,然後提取的所有文件也將暢通無阻。

1

請確保在您的客戶端計算機上包含C++運行時庫(CRT)。

相關問題