2017-09-05 81 views
2

我的團隊最近從VS2008升級到VS2015。我們的項目是C#SDK層和C++核心庫的組合,它們以混合模式CLR和直接非託管引用/ pinvoke工作。IIS 7.5+ 64位無法加載C++ CLR dlls

針對桌面可執行文件的VS2015編譯在跨多個環境的託管和非託管版本中都能很好地工作。但是,當我們在IIS/bin中使用相同的.NET驅動程序和C++庫時,Web服務器無法加載任何使用CLR編譯的C++ dll。這是在VS2015之內,並且在我們的開發和生產箱之外。我們可以設置任何C++司機到託管CLR,我們看到了失敗的結果:

錯誤無法加載文件或程序集「ConfigAuth.DLL」或它 的一個依賴。指定的模塊無法找到。

該文件清楚地發現,PATH變量三重檢查。我們運行了進程監視器來查找dll文件加載問題,並且似乎無法找到任何能夠提供缺少內容的線索。過去我們遇到了缺少可重新分發包的問題,​​並且已經讀過一些組合失敗的問題。我們已經卸載並重新安裝了這些軟件包,但也許我們是在錯誤的順序/組合中執行它?

發展箱/配置:

Windows 7中,64位的環境

以下VS C++可再發行的軟件包被安裝在盒:2012,2013,2015(均爲86/64爲每個)

的SxS合併2012-2015模塊安裝

所有文件編譯成的Win32/x86平臺

.NET 4.5用於編譯的ASP.NET WCF服務建立以及所有C#管理的DLL

.NET 4.0是用於編譯的C++ CLR的mscorlib程序

IIS 7.5+ 64位具有麻煩裝載在VS2015上使用2015工具包編譯的C++庫。

IIS應用程序池支持32個組件

IIS應用程序池已設置了訪問

PATH變量已設置並針對加載就好非其他文件測試文件中的所有目錄和Windows的訪問權限CLR

回答

0

我調試的典型方法分兩個階段。

首先,我0123¾看看是否有任何.net依賴關係丟失。任何無法找到的程序集都會將日誌寫入指定的位置。有時可能發生的情況是應用程序池會在ASP.Net編譯期間影響副本程序集,並且不包括依賴項。這將有助於找到它。

第二,我運行Dependency Walker來獲得一組依賴於本機代碼的dll,如果我只是看着這個集合看不清楚,我運行Process Monitor並過濾失敗的DLL負載(路徑以「.dll」和結果不是「SUCCESS」)。

​​

+0

感謝這一點,我們使用了這兩個工具,發現一個較低級別的驅動程序失敗。我們知道,如果我們在加載的任何驅動程序上使用/ clr選項,IIS將無法加載它們。如果我們關閉/ clr,它們會加載。我很確定它正在GAC中檢查具有/ clr設置的驅動程序,這可以解釋我們的問題。如果我們將它放到項目的Bin文件夾中,我們設置爲/ clr的驅動程序肯定無法編譯,如果我們將它放到PATH文件夾中,它仍然不會加載。來自Fusion Loggin的錯誤:從文件中提取清單導入時出錯(hr = 0x80131018)。 –

+0

它也從bin文件夾中找到這個較低的lib。所以,如果它製作影子副本,我有點迷路。這在VS 2015 IDE Express IIS和IIS獨立內部失敗。 日誌:大會下載成功。嘗試安裝文件:C:\ Users \ kieran \ Source \ Repos \ iTrace \ 2dmi \ WebAPI \ bin \ BitShuffle.dll 日誌:進入下載緩存設置階段。 ERR:從文件中提取清單導入時出錯(hr = 0x80131018)。 錯誤:安裝失敗,hr = 0x80131018。 ERR:無法完成程序集的設置(hr = 0x80131018)。探測終止。 –

相關問題