2010-01-19 41 views
2

擁有一個託管C++項目的A.dll(沒有其他依賴關係) 從B.dll這是一個C#項目,其中A.dll被引用並且具有Nunit方法foo()。 如果從foo()調用託管C++代碼,我得到了FileNotFoundException:指定的模塊找不到。 (來自HRESULT的異常:0x8007007E)。直接從C#調用託管的C++失敗

我試圖將B.dll更改爲控制檯應用程序,併發生同樣的異常。 如果我在B.dll中的某個其他c#類中封裝託管C++代碼,然後從foo()調用封裝器,那麼所有的工作都很好。

託管C++是一個靜態類,其中所有函數參數都是託管類型。

想法?

感謝, 蓋伊

回答

2

這不是一個託管的DLL加載錯誤,您不能在Fuslogvw.exe中看到它。我猜想對於C++/CLI程序集無法定位的非託管DLL依賴項。您將能夠看到Windows使用SysInternals的ProcMon實用程序搜索DLL。

+1

非常感謝!這個問題確實是一個C++非託管dll,缺席。哥們,謝啦。 – Guy 2010-01-20 07:58:37

0

你必須把C++的DLL到您的NUnit的DLL居住的同一文件夾中,否則它不會找到C++ DLL加載。

+0

因爲從簡單的main()的 – Guy 2010-01-19 17:30:46

+0

甚至出現問題這是不相關的NUnit的,我從來沒有說,這是關係到NUnit的,它關係到地方的任何DLL生活中要調用的C++ DLL。調用C#DLL是不夠的,您需要將C++ DLL放在與調用C#DLL的任何其他DLL相同的文件夾中。意味着所有3個DLL需要位於同一個文件夾中。 – 2010-01-19 17:39:34

1

使用fuslogvw查看它試圖從哪裏加載託管dll。這會告訴你你應該把它放在哪裏。

0

好吧,我想我知道了,如果我錯了,請糾正我。 由於我直接從C#代碼調用MC++,因此某些預加載過程「知道」我稱MC++從而嘗試加載MC++和相關C++本機庫,因爲它們不在%PATH%,當前Dir(本機庫)中,因此它失敗了。當我調用由C#類包裝的MC++時,加載階段稍後完成(我有一個C#代碼將本機dll的路徑壓入%PATH%,在前一種情況下甚至沒有達到此代碼。 ..),從而成功。

所以我的選擇是將本地C++路徑不斷放入%PATH%中,而不是在運行時嘗試(僅針對正在運行的進程)。

想法?

蓋伊