2015-12-29 76 views
0

我想從我的asp.net mvc web應用程序調用我的非託管dll。 當我從本地調用這個DLL它工作得很好。 發佈應用的目標Azure和嘗試調用這個DLL我得到這個時候:試圖加載unmmanaged C++ dll在azure

Error:System.DllNotFoundException: Unable to load DLL 'SerenityConfigCodec.dll': A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A).

  1. 我成功在蔚藍的(不是我)打電話給一個簡單的DLL。根據微軟azure文檔。
  2. 我在我的dll上使用了一個依賴walker來了解我在azure中需要的dll並添加它們。

我有一些理論認爲,我的DLL需要一些額外的dll在天藍色,依賴沃克沒有告訴我他們。 或者也許我需要將我的網站連接到iis,並嘗試使用iisreset,以使azure中的.bin文件夾在運行時進入鎖定狀態,並讓iisreset解鎖它。

回答

0

聽起來像Azure無法找到您引用的DLL。

此DLL是否作爲項目中的依賴項添加?或者作爲一個Nuget包?

如果它是一個依賴有根據您的發佈方法兩個可能的解決方案:

  • 添加複製本地爲True如果您正在使用Web部署發佈(右鍵單擊>從Visual Studio發佈)
  • 如果通過持續集成和倉庫裏的鏈接發佈(GitHub上/到位桶/ VSO /等),的DLL文件添加到您的存儲庫(也許在一個文件夾ES爲此),並使用該文件夾路徑在您的項目中引用它。

如果它是一個NuGet包,它會失敗,如果你正在使用的Web部署(除非您設置的複製本地爲True),如果您是通過持續集成部署,捻負責下載的所有包部署過程。

+0

我不能從引用選項卡添加dll,因爲它是非託管dll,所以我將它添加到項目中(添加現有項目),這樣它可以很好地處理簡單的dll,但與我的dll我認爲我需要在azure更多dll,依賴walker不告訴我他們。它真的很沮喪): – ozsh83

+0

有時我得到另一個錯誤:從HRESULT異常:0x8007007E。我不知道錯誤之間有什麼區別。 – ozsh83

+0

我在哪裏可以罰款「複製本地爲真」? – ozsh83

0

我通過將編譯的非託管DLL文件添加到託管項目中解決了此問題,因此它將包含在發佈包中。由於添加的文件是調試版本或發佈DLL,因此我必須手動編輯.csproj文件,纔能有條件地複製調試或發佈構建DLL,具體取決於構建調試版本還是發佈託管DLL。這反過來會在每次加載項目時生成警告,但構建器會正確處理它。而且我需要記住重建託管DLL以使它能夠接受對非託管DLL的更改,因爲它不會自動爲我執行此操作。

根據您使用的VS版本,您可能還需要安裝C++運行時DLL。

0x8007045A錯誤表示找到了DLL但init失敗,而0x8007007E錯誤提到了對另一個答案的註釋,表明它找不到要加載的DLL。