本节包含的示例演示如何部署用 Visual Studio 2005 生成的 Visual C++ 应用程序。
部署方案
假定我们有 MyApplication.exe 和 MyLibrary.DLL,两者都是使用 MFC 生成的。MyApplication.exe 依赖 MyLibray.DLL,两者都使用共享 DLL 中的 MFC,并且都可以是本机或混合 (/clr) 二进制文件。在最简单的情况中,两者都是由没有更改任何默认设置的向导生成的。本节中的示例描述如何将此应用程序部署到没有安装 Visual Studio 的其他计算机上。本节主要包括部署应用程序的发布版本;然而,也指出了部署应用程序的调试版本所需的更改。
注意 |
EULA 不允许重新发布调试 VC++ 程序。此操作仅可以出于测试目的在内部进行。请参见 Visual Studio 2005 的 EULA。 |
初始安装
此方案中考虑使用三台计算机。
一台是开发计算机,用于生成应用程序。其上安装了 Visual Studio 2005(STD、PRO 或 TS)。
其余两台是部署目标计算机,其上没有安装 Visual Studio 2005。部署目标 1 是运行支持应用程序到其依赖项的基于清单的绑定的操作系统 (Windows XP Home Edition、Windows XP Professional、Windows Server 2003) 的计算机。部署目标 2 运行不支持类似绑定的操作系统(Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition 和 Windows 2000)。
我们的目标是在开发计算机上生成应用程序,然后将该应用程序部署到两台目标计算机上并运行它。
准备
当生成将在其他计算机上运行的 Visual C++ 二进制文件后,需要确定此二进制文件依赖哪些 DLL。依赖项查看器 (Dependency Walker) 是查看这些依赖关系的有用工具。在此方案中,必须考虑 Visual C++ DLL,尤其是 CRT 和 MFC。如果在 Visual Studio 中打开 MyApplication.exe 的调试版本并且浏览其资源,可以看到 RT_MANIFEST 资源。它是嵌入到二进制文件内部的清单。如果将其导出并作为 XML 文件打开,您将看到以下内容:
| 复制代码 |
|
这意味着此应用程序依赖下列程序集:
- Microsoft.VC80.DebugCRT 程序集,8.0.50613.12800 版本,适用于 x86
- Microsoft.VC80.DebugMFC 程序集,8.0.50613.12800 版本,适用于 x86
- Microsoft.Windows.Common-Controls 程序集,6.0.0.0 版本,适用于 x86
在二进制版本中,您将看到以下内容:
| 复制代码 |
|
这意味着此应用程序依赖下列程序集:
- Microsoft.VC80.CRT 程序集,8.0.50613.12800 版本,适用于 x86
- Microsoft.VC80.MFC 程序集,8.0.50613.12800 版本,适用于 x86
- Microsoft.Windows.Common-Controls 程序集,6.0.0.0 版本,适用于 x86
对于调试版本和发布版本,都会在 MyLibrary.dll 中看到类似的清单。请注意,清单 ID 对于 EXE 为 1,对于 DLL 为 2。此外,如果清单未嵌入到二进制文件中,它将存储为 <binaryname>.<extension>.manifest 并且具有相同的内容。
注意 |
Visual Studio 2005 不支持生成不带有清单的 C++ 应用程序,并且不支持使用 %PATH% 通过旧方式绑定到 Visual C++ 库。而且,Visual C++ DLL 可以对此进行检测,阻止加载 DLL 并报告不受支持的方案和必要的更改。不要使用 /manifest:no 或删除清单。 |
部署方法
在此示例中,我们要将 MyApplication.exe 安装到 %TARGET% 文件夹中,客户可以在安装过程中指定该文件夹。MyLibrary.dll 将安装在 %TARGET%\MyLibrary 中,并且将 \MyLibrary 添加到该路径。
我们将检查两种部署 VC++ 应用程序的方法:
- 使用安装和部署项目生成安装程序包。
- XCopy 部署。
对于每种方法,我们将研究两个方案:
- 将 Visual C++ 库部署为共享程序集。
- 将 Visual C++ 库部署为私有程序集。
在方案 1 中,WinSxS 文件夹中仅有 Visual C++ DLL 的一个副本。在方案 2 中,将有 Visual C++ DLL 的两个副本,它们安装在应用程序 EXE 和 DLL 的本地文件夹中。
注意 |
|
示例
如何:使用安装和部署项目进行部署
如何:使用 XCopy 进行部署
本主题演示使用安装和部署项目的部署。有关此部署方案的背景,请参见部署示例。
用于部署 Visual C++ 库 DLL 作为共享程序集的过程
创建安装和部署项目
- 在“文件”菜单中,单击“新建项目”,打开“其他项目类型”节点并选择“安装和部署”,然后单击“安装项目”。提供一个名称,然后单击“确定”。
将 EXE 和 DLL 添加到项目中并指定它们应在目标计算机上安装的位置
- 在“项目”菜单中,选择“添加”,然后单击“文件”。
- 找到包含 MyApplication.exe 和 MyLibrary.DLL 的文件夹,然后选择这两个文件。
- 在“文件系统”窗口中,右击“应用程序文件夹”,指向“添加”,然后单击“创建”以创建一个新文件夹。将其命名为 MyLibrary。
- 再次单击“应用程序文件夹”,选择 MyLibrary.DLL 并将其拖放到 MyLibrary 文件夹中。在“解决方案资源管理器”中,在您的项目下的“检测依赖项”中,您应看到 Visual Studio 在 MFC80.dll 和 MSVCR80.dll 上检测依赖项。您需要为这些 DLL 添加相应的合并模块。
- 在“项目”菜单上,指向“添加”,然后单击“合并模块”。选择 Microsoft_VC80_CRT_x86.msm 和 Microsoft_VC80_MFC_x86.msm,然后单击“确定”。
注意 |
这些合并模块的调试版本的名称为 Microsoft_VC80_DebugCRT_x86.msm 和 Microsoft_VC80_DebugMFC_x86.msm。 |
若要将 64 位应用程序部署到 64 位操作系统,请选择相应平台的合并模块。对于 x64,选择 Microsoft_VC80_CRT_x86_x64.msm 和 Microsoft_VC80_MFC_x86_x64.msm;对于 Itanium,选择 Microsoft_VC80_CRT_x86_ia64.msm 和 Microsoft_VC80_MFC_x86_ia64.msm。
生成 setup.exe
- 在“生成”菜单上单击“生成解决方案”。
运行 setup.exe
- 您的应用程序将安装在指定的目标文件夹中。
- 合并模块将 CRT 和 MFC 程序集安装为共享的并行程序集。可通过检查 %WINDIR%\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50613.12800_x-ww_b7acac55\ 和 %WINDIR%\WinSxS\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50613.12800_x-ww_88931f5a\ 文件夹对此进行验证
- 应用程序和 DLL 在运行时使用 CRT 和 MFC 程序集。必须将 %TARGET%\MyLibrary 添加到 PATH 环境变量中,以便 MyApplication.exe 可以找到 Mylibrary.Dll。(也可以将其重新生成为并行程序集。)
在不支持基于清单的绑定的操作系统(Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition 和 Windows 2000)上,将发生以下情况:
- 您的应用程序将安装在指定的目标文件夹中。
- 合并模块在两个位置安装 CRT 和 MFC 程序集:
- %WINDIR%\System32 - 这可确保即使操作系统不支持基于清单的绑定,应用程序也可在此操作系统上运行。
- %WINDIR%\WinSxS(与 Windows XP Home Edition、Windows XP Professional、Windows Server 2003 相似)- 这可确保当操作系统升级到 Windows XP Home Edition、Windows XP Professional、Windows Server 2003 时,应用程序将仍运行并使用 WinSxS 中的 DLL。在 Windows Upgrade 通知已安装的应用程序有关操作系统升级的过程中,将移除 System32 中的 DLL。
- 应用程序和 DLL 在运行时使用来自 System32 的 CRT 和 MFC DLL。
用于部署 Visual C++ 库 DLL 作为私有程序集的过程
创建安装和部署项目
- 在“文件”菜单中,单击“新建项目”,打开“其他项目类型”节点并选择“安装和部署”,然后单击“安装项目”。指定一个名称,然后单击“确定”。
将 EXE 和 DLL 添加到项目中并指定它们应在目标计算机上安装的位置
- 在“项目”菜单中,选择“添加”,然后单击“文件”。
- 找到包含 MyApplication.exe 和 MyLibrary.DLL 的文件夹,然后选择这两个文件。
- 在“文件系统”窗口中,右击“应用程序文件夹”,指向“添加”,然后单击“创建”以创建一个新文件夹。将其命名为 MyLibrary。
- 再次单击“应用程序文件夹”,选择 MyLibrary.DLL 并将其拖放到 MyLibrary 文件夹中。在“解决方案资源管理器”中,在您的项目下的“检测依赖项”中,您应看到 Visual Studio 在 MFC80.dll 和 MSVCR80.dll 上检测依赖项。您需要为 \vc\redist 文件夹中的这些程序集添加相应的文件夹。
注意 |
对于调试版本,使用 \vc\redist\debug_nonredist。 |
- 在 Windows 资源管理器中,打开 %PROGDIR%\Microsoft Visual Studio 8\VC\Redist\x86。
- 按住 Ctrl,单击 Microsoft.VC80.CRT 和 Microsoft.VC80.MFC 文件夹。将这些文件夹拖到 Visual Studio 并将它们拖入“应用程序”文件夹中。
- 重复步骤 7,但这次将文件夹拖到 MyLibrary 文件夹中。
您可能看到来自 Visual Studio 的消息,指出您正在包含作为合并模块一部分的 DLL。这正是您要执行的操作,因此,单击“否”以指示您不希望对此 DLL 使用 MSM。
仅当使用 MFC/Winforms 集成时,才需要 mfcm80.dll 及其 Unicode 版本 mfcm80u.dll。否则,可从安装中移除这些 DLL。
仅当正在应用程序中使用托管代码时,例如,当用 /clr 或 /clr:pure 生成项目时,才需要 msvcm80.dll。
如果安装项目中包括 mfcm80.dll、mfcm80u.dll 或 msvcm80.dll,需要安装 .NET Framework。如果目标计算机上未安装 .NET Framework 2.0,安装将不会运行。
对于调试安装,在上一步中将 CRT 更改为 DebugCRT 并将 MFC 更改为 DebugMFC。
对于将 64 位应用程序部署到 64 位操作系统,使用 \vc\redist\amd64 或 \vc\redist\ia64。
生成 setup.exe
- 在“生成”菜单上单击“生成解决方案”。
运行 setup.exe
- 您的应用程序将安装在指定的目标文件夹中。
- 该应用程序和 DLL 在运行时使用来自 Microsoft.VC80.CRT 和 Microsoft.VC80.MFC 文件夹的 CRT 和 MFC 程序集。
在不支持基于清单的绑定的操作系统(Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition 和 Windows 2000)上,不建议使用此部署方法。强烈建议您改用 MSM。如果尝试进行安装,将发生以下情况:
- 您的应用程序将安装在指定的目标文件夹中。
- 默认情况下,操作系统加载程序将找不到 CRT 和 MFC DLL。必须将 Microsoft.VC80.CRT 和 Microsoft.VC80.MFC 添加到 PATH。
注意 |
MSM 允许您根据目标计算机的操作系统执行自定义步骤。您可能希望仅在不支持基于清单的绑定的操作系统(即 Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition 和 Windows 2000,而非 Windows XP Home Edition、Windows XP Professional、Windows Server 2003)上将这些目录添加到 PATH 中。 |
本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序。此技术对于在其他计算机上调试应用程序很有用。有关此部署方案的背景,请参见部署示例。
将 Visual C++ 库 DLL 部署为共享程序集
- 在开发计算机上创建一个文件夹结构,让其与将在目标计算机上使用的文件夹结构一致。对于此示例,创建一个 \bin 文件夹并将 myapplication.exe 复制到其中。然后,创建一个 \bin\mylibrary 文件夹并将 MyLibrary.dll 复制到其中。
- 将此文件夹复制到目标计算机。
- 将 vcredist_x86.exe from %PROGDIR%\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe 复制到目标计算机
- 在目标计算机上运行 vcredist_x86.exe。这将安装所有 库作为共享程序集。在支持应用程序到其依赖项的基于清单的绑定的目标计算机 (Windows XP Home Edition、Windows XP Professional、Windows Server 2003) 上,这些库将安装到 WinSxS 文件夹中。在不支持类似绑定的目标计算机(Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition 和 Windows 2000)上,这些库安装到 WinSxS 和 System32 两个文件夹中。
注意 |
对于将 64 位应用程序部署到 64 位操行系统,使用 vcredist_x64.exe 或 vcredist_ia64.exe。 |
注意 |
vcredist_*.exe 仅安装发布版本的 DLL。调试版本只应当作为私有程序集部署;有关更详细信息,请参见下一个过程。 |
- 您的应用程序可以运行了。
将 Visual C++ 库 DLL 部署为私有程序集
- 在开发计算机上创建一个文件夹结构,让其与将在目标计算机上使用的文件夹结构一致。对于此示例,创建一个 \bin 文件夹并将 myapplication.exe 复制到其中。然后,创建一个 \bin\mylibrary 文件夹并将 MyLibrary.dll 复制到其中。
- 在开发计算机上,将 Microsoft.VC80.CRT 和 Microsoft.VC80.MFC 从 %PROGDIR%\Microsoft Visual Studio 8\VC\Redist\x86 复制到 \bin 和 \bin\MyLibrary 中。
注意 |
对于将 64 位应用程序部署到 64 位操作系统,使用 \vc\redist\amd64 或 \vc\redist\ia64。 |
- 将 \bin 文件夹复制到目标计算机。在支持基于清单的绑定的目标计算机 (Windows XP Home Edition、Windows XP Professional、Windows Server 2003) 上,没有必要做进一步的准备。在不支持类似绑定的计算机(Windows 95、Windows 98、Windows 98 Second Edition、Windows Millennium Edition 和 Windows 2000)上,路径中必须有 Microsoft.VC80.CRT 和 Microsoft.VC80.MFC。
注意 |
对于调试应用程序,使用 \vc\redist\debug_nonredist\ 中的 DLL。 |