我有一個C++/CLI項目,它圍繞一個非託管的C壓縮庫,並且這個項目被一個調用C++壓縮函數的MVC3項目引用。Windows Azure沒有找到C++/CLI項目的DLL
一切工作正常當地,但是當我發佈解決Azure雲,我得到一個錯誤說,它無法找到該模塊/ DLL:
無法加載文件或程序集「LZGEncoder.DLL '或它的一個依賴關係。指定的模塊無法找到。
爲什麼找不到DLL文件?它到了錯誤的地方還是被編譯了?有什麼方法可以檢查嗎?謝謝!
我有一個C++/CLI項目,它圍繞一個非託管的C壓縮庫,並且這個項目被一個調用C++壓縮函數的MVC3項目引用。Windows Azure沒有找到C++/CLI項目的DLL
一切工作正常當地,但是當我發佈解決Azure雲,我得到一個錯誤說,它無法找到該模塊/ DLL:
無法加載文件或程序集「LZGEncoder.DLL '或它的一個依賴關係。指定的模塊無法找到。
爲什麼找不到DLL文件?它到了錯誤的地方還是被編譯了?有什麼方法可以檢查嗎?謝謝!
問題是Visual C++ 2010運行時庫從雲端丟失。
我所做的是將Visual C++ 2010 Redistributable軟件包添加到項目中,以及在啓動時靜默安裝它的腳本,以及現在本機的dll的工作。如果你使用原生的C DLL,你也需要這個。
步驟:
1)Download Visual C++ 2010 Redistributable Package,並把它添加到您的項目。
2)新建一個批處理文件,它添加到它:
vcredist_x64.exe /q /norestart
exit /b 0
3)打開ServiceDefinition.csdef中文件及有關WebRole元素補充一點:
<Startup>
<Task commandLine="InstallVCRedist.bat" executionContext="elevated" taskType="simple" />
</Startup>
更新:
Visual C++ 2012出來,並且相同的腳本工作,雖然e確保Azure至少運行Windows Server 2008 R2,否則啓動任務將掛起並且角色永遠不會啓動(直到您通過RDP終止任務管理器中的vcredist進程)。
如何將ServiceDefinition.csdef添加到VS 2012 express web版本中的現有項目中? – newman
你能否具體把vcredist_x64.exe和InstallVCRedist.bat放在哪裏?在哪個項目和文件夾?我把它們放在asp.net項目的bin文件夾中,並將它們標記爲「始終複製」,但似乎不起作用。不知道如何調試問題。任何提示都非常感謝! – newman
@miliu你把它放在哪裏並不重要。我將這兩個文件複製到我的解決方案的根文件夾,然後通過Visual Studio將它們添加到我的解決方案中。 bin文件夾包含構建的輸出,你不應該把靜態的東西放在那裏,最終複製文件到bin文件夾。 –
請確保C++ dll和非託管C庫(如果它是.dll而不僅僅是源)都包含在您的服務包中,並確保編譯器將C++庫轉儲到正確的位置。 This article有一個體面的演練。
如果您想驗證Azure虛擬機上的內容,只需解壓縮您的CSPKG文件,然後再解壓縮.CSSX文件(只需將CSSX重命名爲zip)即可匹配每個引用都在那裏。這樣你就可以匹配虛擬機上的內容。一旦您驗證VS中缺少DLL,請選擇參考DLL並將其「複製本地」屬性設置爲「True」。
我明天會在工作中嘗試這個,謝謝。當你說缺少DLL時,你的意思是它可能取決於其他某些在雲上不可用的DLL,但只能在本地使用? –
是的,正好..當在管理項目中使用本地引用時,您需要提供本地引用所需的所有DLL。有時您可能需要在Azure VM上安裝本機運行時才能獲取所有本地引用。 (它可能不是你的情況,但它肯定可以安裝VC++ runtine來獲得本地引用,但這一切都取決於你使用的本地引用) – AvkashChauhan
是的確實如此,我需要VC++ 2010運行時庫,或者我可以使用VS2008編譯項目,因爲Azure使用開箱即用的舊庫。我會投你的答案,但我還不能這樣做。 –
您需要將所有dll放置在實時服務器上存在的文件夾中。如果您從本地添加引用,並且該位置在現場不存在,則您無法在實時生成代碼。因此,請確保所有的dll都存在於實時部署代碼之前的現場。
它聽起來不像你的項目是一個X64程序集,因此無法加載你的參考庫 –