2012-01-03 36 views
1

相當簡單的問題,我希望,但我沒有設法找到尚未對谷歌問題的解答...FileNotFoundException異常 - 動態發現

我在C#中的測試環境中工作,而且我引用然後管理C++ DLL,然後引用正常的C++程序集。當我嘗試運行我的測試時,我得到一個FileNotFoundException,它沒有給出我無法找到的文件的任何細節。

System.IO.FileNotFoundException:找不到指定的模塊 。 (異常來自HRESULT:0x8007007E)

我已經做了一些討論procmon檢查,發現它試圖加載的C++ DLL的一個,但它的探測所有標準的地方(C:\ Windows中,C:\ WINDOWS \系統等​​)。有沒有一種方法可以將其重定向到包含所有我們的二進制文件所在的附加文件夾?

我猜AppDomain上有一些東西,但我還沒弄清楚哪個屬性可以使用,哪些會起作用。

+0

您是否嘗試過進入屬性並設置了C++的dll複製本地和或你試圖GAC或引用添加到該.dll直通設計師。 。? – MethodMan 2012-01-03 16:46:03

+0

我無法更改C++ Dll,並且不希望它在GAC中...對不起 – Ian 2012-01-03 16:52:04

+0

我沒有安裝適當的C++運行時庫,在部署中看到過這種類型的東西。您是否能夠直接加載和執行非託管C++ DLL,即從本機C++應用程序? – dgvid 2012-01-03 17:17:31

回答

1

按照漢斯建議:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetDllDirectory(string lpPathName); 

SetDllDirectory(@"C:\SomeDir"); 
1

只需將該路徑添加到Path環境變量即可。

在Windows 7中:按Windows鍵,鍵入 '環境',選擇Edit the system environment variables,選擇Environment variables ...添加路徑...

編程:this post

但我認爲更常見的方法是將引用的DLL複製到您的輸出目錄。即使這需要更多的磁盤空間,它也會保證所引用的DLL始終與您的C#應用​​程序兼容。如果DLL通過CVS更新而更改,並且不重建C#應用程序,則它可能無法按預期啓動。

+0

很可能會工作,但是有可能通過C#來完成嗎?我不想告訴整個Dev團隊在可能的情況下更新他們的環境變量...... – Ian 2012-01-03 16:51:34

+0

@lan:編輯後。儘管如此,我不認爲這是更好的解決方案。如果一個開發人員在'D:\ yourpath'上使用dll而不是'C:\ yourpath'會怎麼樣? – Matthias 2012-01-03 16:53:48

+0

這是一個很好的觀點,雖然在這種情況下我們的構建路徑是固定的...... – Ian 2012-01-03 16:57:09

相關問題