我有一个包含非托管C压缩库的C ++ / CLI项目,该项目由调用C ++ Compress函数的MVC3项目引用。
一切都在本地工作正常,但是当我将解决方案发布到Azure云时,我收到错误消息,说它无法找到模块/ dll:
无法加载文件或程序集“LZGEncoder.DLL”或其依赖项之一。找不到指定的模块。
为什么找不到DLL文件?是去了错误的地方还是正在编译?有什么方法可以检查吗?谢谢!
答案 0 :(得分:6)
问题是云端缺少Visual C ++ 2010 Runtime库。
我所做的是将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已经完成并且相同的脚本可以运行,但每个人都应该确保Azure至少运行Windows Server 2008 R2 ,否则启动任务将挂起并且角色永远不会启动(直到你通过RDP杀死任务管理器中的vcredist进程。
答案 1 :(得分:2)
如果要验证Azure VM上的内容,只需尝试解压缩CSPKG文件,然后再解压缩.CSSX文件(只需将CSSX重命名为zip)并匹配每个引用都在那里。这样您就可以匹配VM上的内容。验证VS中缺少的DLL后,选择参考DLL并将其属性“Copy Local”设置为“True”。
答案 2 :(得分:1)
您需要将所有dll放在实时服务器上存在的文件夹中。如果您从本地添加引用并且该实时不存在该位置,则无法在实时上构建代码。因此,在实时部署代码之前,请确保所有dll都存在于实时。
答案 3 :(得分:0)
确保C ++ dll和非托管C库(如果它是.dll而不仅仅是源代码)都包含在您的服务包中,并确保编译器将C ++库转储到正确的位置。 This article有一个不错的演练。