我有一个包含非托管 C 压缩库的 C++/CLI 项目,该项目由调用 C++ 压缩函数的 MVC3 项目引用。
在本地一切正常,但是当我将解决方案发布到 Azure 云时,我收到一条错误消息,说它找不到模块/dll:
无法加载文件或程序集“LZGEncoder.DLL”或其依赖项之一。指定的模块无法找到。
为什么找不到DLL文件?它是去错了地方还是被编译了?有什么办法可以查吗?谢谢!
问题是云端缺少 Visual C++ 2010 运行时库。
我所做的是将 Visual C++ 2010 Redistributable 包添加到项目中,以及在启动时静默安装它的脚本,现在本地 dll 的工作。如果您使用本机 C dll,您也需要这个。
脚步:
1)下载 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 的任务管理器)。
如果您想验证 Azure VM 上的内容,只需尝试解压缩您的 CSPKG 文件,然后再次解压缩 .CSSX 文件(只需将 CSSX 重命名为 zip)并匹配每个引用都在那里。这样您就可以匹配 VM 上的内容。验证 VS 中缺少什么 DLL 后,选择 Reference DLL 并将其属性“Copy Local”设置为“True”。
您需要将所有 dll 放在实时服务器上存在的文件夹中。如果您从本地添加引用并且该位置不存在于现场,那么您将无法在现场构建代码。因此,在现场部署代码之前,请确保所有的 dll 都存在于现场。
确保 C++ dll 和非托管 C 库(如果它是 .dll 而不仅仅是源代码)都包含在您的服务包中,并确保编译器将 C++ 库转储到正确的位置。这篇文章有一个不错的演练。