65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 ClickOnce 部署 MFC 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (31投票s)

2008 年 1 月 14 日

CPOL

5分钟阅读

viewsIcon

93246

通过 ClickOnce 部署 MFC 应用程序的分步教程

引言

最近我有一个任务,需要通过 ClickOnce 部署一套 MFC 应用程序及其依赖项。Visual Studio 不直接支持 MFC 应用程序的部署(即使是使用 /clr 编译的),我在网上找到的一个建议解决方案是创建一个存根 C# 可执行文件,然后用它来启动主要的 MFC 应用程序。这样你就可以利用 Visual Studio 内置的部署功能了。我的朋友 Rama Vavilala 给出了一个更好的建议——他让我尝试在主项目中放入一个使用 /clr 编译的虚拟 cpp 文件。如果 ClickOnce 接受这样的可执行文件作为 .NET 程序集,那么我只需要自己创建所需的清单文件即可。好吧,我只能说向 Rama 致敬,他的解决方案非常巧妙——因为它确实奏效了。本文将分步图解说明如何使用这个技巧来部署 MFC 应用程序。

部署 MFC 应用程序的步骤

在我的示例中,我将使用一个简单的 MFC 对话框应用程序——但你可以将此技术应用于具有依赖项(托管和原生)的真实应用程序,并且它会起作用(我已成功实现)。

步骤 1 - 添加虚拟 /clr 文件

向你的项目添加一个新的 cpp 文件并将其留空。将其编译设置更改为使用 /clr 并移除预编译头文件的支持。根据你主项目的设置,你还可能需要调整其他一些设置以允许 /clr 编译模式。现在构建应用程序。即使你的项目中有一个空的 /clr cpp 单元,你会发现该应用程序在所有方面都是一个 .NET 应用程序(你可以通过在 Reflector 中打开该应用程序来验证)。

步骤 2 - 创建部署文件夹并共享

显然,在你的情况下,部署文件夹可能是一个 FTP URL 或 Web URL——所以请相应地更改它。我只是在我机器上使用了一个共享的网络路径。我创建了一个名为 AppDeploy 的文件夹(该文件夹已使用相同的名称在网络上共享),然后将 MFC 应用程序复制到了该文件夹。如果你有依赖项,也需要将这些文件复制到该文件夹。

步骤 3 - 创建应用程序清单

你不需要从头开始做这个。相反,你可以使用 **mageui** 工具来创建一个默认的应用程序清单。第一步是指定应用程序的名称、版本和处理器类型。请参见屏幕截图,我已在此处突出显示了相关的更改。

步骤 4 - 填充文件

你可以通过指定应用程序目录来自动填充所需文件。它将自动检测主应用程序(但如果你有多个可执行文件,你可能需要手动修复)。

步骤 5 - 对应用程序清单进行签名

你可以将其余设置保留原样并保存文件——你会看到一个签名对话框,如上所示。由于这是第一次,请使用 [新建] 按钮创建一个新证书。如果你的公司有实际的证书可以使用,那么你显然会使用那个。

步骤 6 - 创建部署清单

下一步是创建部署清单,使用与应用程序清单相同的名称和版本。请记住将处理器设置为 x86。

步骤 7 - 设置应用程序说明

此步骤是可选的,但这是 ClickOnce 对话框在用户尝试运行应用程序时显示给最终用户的信息。所以你可能想在那里放一些有用的信息。

步骤 8 - 设置 ClickOnce 部署选项

我选择了本地安装——这样每次都会缓存应用程序(除非有新版本)。我还为 ClickOnce 应用程序设置了一个启动位置。你的 URL 显然会不同。

步骤 9 - 设置更新选项

我使用了默认的更新选项,但你可以尝试这些设置,找到最适合你需求的。

步骤 10 - 引用应用程序清单

在这里,你将应用程序清单与部署清单关联起来。**mageui** 工具将自动从清单中填充所需信息。

步骤 11 - 保存并签名部署清单

你可以在保存期间使用与之前相同的密钥来签名清单。请注意,如果你愿意,可以使用不同的密钥来签名部署清单。

完成

就是这样。你可以尝试通过 ClickOnce URL 运行应用程序,你会发现应用程序部署并运行良好。

通过批处理文件更新清单

如果你更新了可执行文件或其任何依赖项,你会发现仅更新部署文件夹是不够的。你必须重新签名清单,并且还要添加新添加的依赖项。你还需要更改版本号,以便 ClickOnce 能正确地用服务器上的更新来更新本地版本。我编写了一个简单的批处理文件供你使用。请相应地更改文件夹和文件名。批处理文件 (Update.bat) 如下所示:

@call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86

mage -u ".\MfcDialog\MFC Application.exe.manifest" -fd .\MfcDialog\ -v %1

mage -u ".\MfcDialog\MFC Application.exe.manifest" -cf .\MfcApp.pfx

mage -u .\MfcApp.application -appm ".\MfcDialog\MFC Application.exe.manifest" -v %1

mage -u .\MfcApp.application -cf .\MfcApp.pfx

我使用了命令行 **mage** 工具(**mageui** basically is a UI version of **mage** - now there's a surprise!)。第一次调用 **mage** 会更新文件并设置应用程序清单上的版本。下次调用会签名应用程序清单。然后我们再次运行 **mage**,这次是对部署清单,以便它能正确更新应用程序清单的详细信息。最后,我们签名部署清单。每次更改任何内容时,文件内容都会发生变化,因此你必须对两个清单进行签名。

你可以通过命令行如下方式运行它:

>Update 1.0.0.3

典型的输出是:

Setting environment for using Microsoft Visual Studio 2008 x86 tools.
MFC Application.exe.manifest successfully updated
MFC Application.exe.manifest successfully signed
MfcApp.application successfully updated
MfcApp.application successfully signed

好的。就这样。你可以尝试并调整各种选项以满足你的需求。如果你有任何建议、反馈或批评,都欢迎。我希望这篇文章能对某些人有所帮助——因为我不太确定是否会有很多人想使用 ClickOnce 来部署他们的 MFC 应用程序。

致谢

  • Rama Vavilala (博客) - 感谢虚拟 /clr 技巧

历史

  • 2008 年 1 月 12 日 - 文章的第一个版本
© . All rights reserved.