我正在尝试将使用特定库(在本例中为 Chilkat)的 Web 项目部署到 Web 主机(appharbor.com)。问题是该库需要 Visual Studio C++ 2010 运行时 (http://www.cknotes.com/?p=311)。我的问题是如何正确部署该运行时?
1.部署方式的选择
在我的本地开发机器上安装了运行时,但我只有 git push 访问托管环境。
基于MSDN,有三种部署运行时的选项:
- 使用可再发行包(推荐)
- 使用合并模块(需要管理权限)
- 与应用程序一起部署
选项 3 是我唯一可以对这台主机执行的操作,因为我没有对服务器的管理访问权限。
2.确定应该部署哪些dll
MSDN 页面指出 dll 应位于“Program Files\Microsoft Visual Studio 10.0\VC\Redist”中。在我的情况下,该位置不存在 Redist 目录(在 64 位上运行,所以我检查了“程序文件”和“程序文件(x86)”)。
我解压缩了可再发行包和其中的 vs_red.cab 以找到包含的 dll 列表: - atl100 - mfc100(+ 语言变体) - mfc100u - msvcp100 - msvcr100 - vcomp100 - msdia71
同时我检查了反射器中的库以查看引用的是什么:-Microsoft.VisualC(.net)-KERNEL32.dll(本机)-MSVCR100.dll(本机)-...还有一个没有名字的神秘库. 显示为带有空文本的模块。
旁注:这里使用的 chilkat 库有 x64 和 x86 版本。我使用 x86 执行这些任务只是因为目标系统似乎是 x86。(部署 x64 会导致“尝试加载格式不正确的程序。”错误。)
3.找到要部署的dll
解压后的 vc_red.cab 中的 dll 命名不正确,所以我决定在硬盘上查找 dll。搜索 atl100 发现三个位置:system32、syswow64 和作为应用程序目录的一部分。
上面提到的所有文件都在 system32 中,除了: - msdia71 (native) - 这与调试有关,根本不在我的磁盘上,所以我假设不需要它。- Microsoft.VisualC (.net) - 在 GAC 中找到了正确版本 (10.x)。
(我没有复制 KERNEL32.dll 因为这是一个 Windows 内置库。)
4. 将库添加到项目中
添加了 VisualC .net 库作为参考。本机库已添加到我的 Web 应用程序的根目录中,并且属性设置为“构建操作:内容”和“复制到输出:始终”。构建完成后,dll 按预期出现在 bin 文件夹中的 .net 库旁边。
但是当我部署和运行时,我收到错误消息:无法加载文件或程序集''或其依赖项之一。指定的模块无法找到。
您可以在这里看到项目的构建输出,我可以观察到我认为需要的 dll 正在被复制到输出目录,但某处仍然存在错误。有人有想法吗?还是更好的调试方法?还是我在做一些愚蠢的事情:)?