2013-10-21 72 views
1

我加載大會在運行時在我的應用程序:IO異常裝載組件無法找到文件

FileStream lDLLStream = lDLLPath.OpenRead(); 
byte[] lDLLArray = new byte[lDLLStream.Length]; 
lDLLStream.Read(lDLLArray, 0, (int)lDLLStream.Length); 

Assembly lAssembly = Assembly.Load(lDLLArray); 

不過,我收到以下異常:

Could not load file or assembly 'UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 

但是,如果我從同一個目錄中加載了一個不同的DLL,這個DLL引用了我最初試圖加載的DLL(並且自然也是UnityEngine,因爲它也有依賴關係),所以我沒有收到任何錯誤消息。

事實上,在負載可以看到第二個(工作)DLL在其引用的程序正是:

UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null 

所以我沒有怎麼看它是否能夠加載第二DLL,這可能是導致它無法加載第一個。

一些附加信息:第一個(非工作)DLL正好是由Unity(3D遊戲引擎)生成的DLL,而第二個DLL是我在Unity解決方案中創建的項目。

我的項目是.NET 4.0(和Unity是3.5),但我試圖設置我的測試DLL編譯爲3.5,並沒有在加載時崩潰。

我不知道這是否會更好地問統一答案?

更新:好吧,也許不像我想的那麼古怪。第二個工作的DLL只能工作,因爲它沒有使用DLL,因此無法加載,所以永遠不會失敗。此外,可以通過在執行目錄中轉儲Unity DLL來加載第一個DLL,所以我想我只需要找到一種將目錄添加到它應該看起來的方式。

更新2:所以我的「固定」這個問題通過聽取

AppDomain.CurrentDomain.AssemblyResolve

,並提出一個對話框,用戶找到丟失的DLL已經固定例外。我希望知道是否有更好的方法來做到這一點。由於用戶正在指定自定義DLL,因此這可能是唯一合理的事情。否則,我會發布這個答案。

回答

0

基本上我的問題是一個隱藏在(一種)微妙的內部的簡單問題。問題只是它不知道在哪裏尋找DLL。我很困惑的事實,我認爲DLL已經加載一次。事實上,由於DLL沒有被使用,所以它從未被加載,所以工作的DLL永遠不會失敗。

如果有人發現這一點,我想我的建議是確保工作DLL實際上是通過使用它的東西加載有問題的DLL。