2013-07-03 36 views
5

我有一個幾乎空的ASP.NET MVC4項目引用一個64位託管程序集,它具有一組非託管的依賴項。64位託管程序集與非託管依賴項不加載在IIS/ASP.NET MVC 4

託管程序集通過引用以常規方式引用。

非託管依賴關係在後期構建事件中被複制到bin文件夾 - 並且在Web應用程序啓動時(這已經過驗證)存在。

的問題是,我得到:

無法加載文件或程序集「msvcm80.DLL」或它的一個依賴。動態鏈接庫(DLL)初始化例程失敗。 (來自HRESULT的例外:0x8007045A)

這是非託管依賴項之一。完整名單是:

  • iconv.dll
  • lbm.dll
  • 的libeay32.dll
  • msvcm80.dll
  • msvcp80.dll
  • MSVCR80.DLL

託管的dll是針對x64構建的,所有依賴關係也是x64(通過使用Dependency Walker進行驗證)。

現在我還創建了一個空白控制檯應用程序,一個Windows窗體應用程序和一個自託管Web Api,其中包含相同的代碼(用於使用託管程序集啓動實例),並且它們都可以正常工作(當強制建立目標爲x64)。

使用融合日誌(首先清除它,然後加載Web應用程序並刷新日誌查看器),我可以看到,有問題加載:

  • iconv.dll
  • 的libeay32.dll
  • lbm.dll

他們都有類似的日誌文件:

LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3b2d5b3e/b1b5f1f5/iconv.DLL. 
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/3b2d5b3e/b1b5f1f5/iconv/iconv.DLL. 
LOG: Attempting download of new URL file:///C:/.../bin/iconv.DLL. 
LOG: Assembly download was successful. Attempting setup of file: C:\...\bin\iconv.dll 
LOG: Entering download cache setup phase. 
ERR: Error extracting manifest import from file (hr = 0x80131018). 
ERR: Setup failed with hr = 0x80131018. 
ERR: Failed to complete setup of assembly (hr = 0x80131018). Probing terminated. 

因此,它實際上發現依賴項位於本地bin文件夾中,但由於某些原因無法使用它們。

錯誤「錯誤提取清單導入文件(hr = 0x80131018)」。意思?

這些依賴項不在GAC中,它們沒有使用regsvr32(不是COM)註冊。

讓我感到困惑的是,在IIS以外工作正常(我甚至嘗試設置應用程序池上的憑據與本地網絡憑據相同 - 當然這沒有什麼區別)。

如何調試此問題的任何好主意?

編輯: 現在我能在我的本地開發機器上運行ASP.NET網站,但當它被部署到另一臺服務器。

我的本地機器的「修復」是從bin目錄中刪除msvcm80.dll(C運行時)。程序集(可能)仍然需要,但在其他地方查找(大概是因爲我在WinSxS中安裝了「正確」版本的CRT(可分發))。

深入研究,我發現託管程序集應該依賴於msvcm80.dll版本8.00.50727.6195(x64),但該特定版本未安裝在本地系統上(我只將它安裝在依賴項文件夾中) - 但我在WinSxs中有一個更新的版本(8.00.50727.6910)。

那麼當不直接將其添加到bin文件夾時,哪一個IIS正在拾取?

第二編輯: 所以看起來lbm.dll有直接依賴於MSVCR80.DLL,但它也有一個依賴於iconv.dll它也有一個依賴於MSVCR80.DLL。但是,根據Dependency Walker(depends.exe),這兩個依賴項不會從相同的目錄解析(即使它們具有相同的版本!)。

如果我確定間接依賴項在PATH環境變量中,並且第二個依賴項在WinSxS中,它將起作用。這顯然不夠好,但我無法弄清楚如何強制從單個位置/文件加載直接和間接依賴關係。

回答

3

使用像Dependency Walker一個工具,你會發現,lbm.dll及其依賴只有依靠msvcr80.dll,而不是msvcp80.dllmsvcm80.dll即使這兩個文件都包含在由lbm.dll使用的Microsoft.VC80.CRT.manifest加載的Visual C++ 2005運行庫的正確版本圖書館。

從您的bin文件夾中刪除msvcp80.dllmsvcm80.dll應該修復您的問題。

+2

謝謝,馬丁,這是完全正確的。 需要最後一件事才能讓它在IIS中運行 - 禁用程序集的陰影複製。如果啓用此選項,則不會將依賴關係進一步複製到卷影副本目錄中。 這可以通過在web.config中插入(在下): cwt237