2

我有一个包含非托管 C 压缩库的 C++/CLI 项目,该项目由调用 C++ 压缩函数的 MVC3 项目引用。

在本地一切正常,但是当我将解决方案发布到 Azure 云时,我收到一条错误消息,说它找不到模块/dll:

无法加载文件或程序集“LZGEncoder.DLL”或其依赖项之一。指定的模块无法找到。

为什么找不到DLL文件?它是去错了地方还是被编译了?有什么办法可以查吗?谢谢!

4

4 回答 4

6

问题是云端缺少 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 的任务管理器)。

于 2012-06-21T11:36:01.217 回答
3

如果您想验证 Azure VM 上的内容,只需尝试解压缩您的 CSPKG 文件,然后再次解压缩 .CSSX 文件(只需将 CSSX 重命名为 zip)并匹配每个引用都在那里。这样您就可以匹配 VM 上的内容。验证 VS 中缺少什么 DLL 后,选择 Reference DLL 并将其属性“Copy Local”设置为“True”。

于 2012-06-20T16:22:41.350 回答
1

您需要将所有 dll 放在实时服务器上存在的文件夹中。如果您从本地添加引用并且该位置不存在于现场,那么您将无法在现场构建代码。因此,在现场部署代码之前,请确保所有的 dll 都存在于现场。

于 2014-06-11T06:32:45.923 回答
0

确保 C++ dll 和非托管 C 库(如果它是 .dll 而不仅仅是源代码)都包含在您的服务包中,并确保编译器将 C++ 库转储到正确的位置。这篇文章有一个不错的演练。

于 2012-06-20T15:05:06.973 回答