使用自定义表单设置项目

8
我目前正在处理一个Visual Studio 2010设置项目,想知道以下是否可行:
1)以一种不显示默认表单的方式运行设置项目,而是显示我自己的自定义表单,该表单订阅设置项目事件。这样,我可以显示安装信息并增加我的进度条。
2)如果1可行,我需要一种指定默认位置的方法。
3)我有一个单独的库项目,其中有一个自定义安装类(从“System.Configuration.Install.Installer”继承),从安装处理程序中,我希望能够显示自定义窗体,并控制用户所做的选择。我想通过添加对system.windows.forms的引用来实现这一点,但这是否是正确的方法?如果我无法隐藏默认的安装表单,则这些自定义表单将出现在默认的安装表单上,我认为这看起来会很糟糕。
欢迎提供建议、链接等 谢谢!
*更新1 *
我能否从C#代码启动.msi,同时传递一个值?
就像这个人在这里做的那样: link 但是传递一个值……然后从我的自定义安装类中,根据这个值采取行动。
更新2
似乎我可以: link code project 更新3
我正在考虑以下操作,我将开始使用一个winforms应用程序进行测试。
1)启动winforms应用程序。 2)进行几个webService调用,显示数据,用户进行选择。 3)根据更新1中的链接,启动进程(静默模式),根据更新2传入所选值。 4)使用某些跨进程事件机制(WCF),使我的自定义安装类能够通知我的表单不同步骤正在运行,并更新进度条和消息。

阅读了您的更新后,您是否考虑过使用ClickOnce? - Emond
@Erno,是的,我有。这将是一个ClickOnce应用程序,其中将嵌入.msi(主应用程序)。执行.msi将安装主应用程序。此外,这个ClickOnce应用程序将控制更新(主应用程序),我会将其作为嵌入式.zip文件,我自己复制/更新文件。之所以这样做,是因为我发现使用ClickOnce很难从代码中控制回滚。因此,我没有将主应用程序设置为ClickOnce,而是使用了一个安装程序/更新程序ClickOnce应用程序来处理所有事情。 - Rauland
@Erno,我在 MSDN ClickOnce 论坛上发布了这篇帖子:Thread。我猜应该有更好的方法来解决这个问题。 - Rauland
是的,更新场景就是我所考虑的。 - Emond
2个回答

2
您可以创建 自定义表单,但声明需要在 MSI 内完成。您可以通过自定义操作显示自定义对话框,但这并不会帮助您太多,因为 Msi 执行以下操作:
  1. 加载自定义操作 dll
  2. 如果它是托管的,则启动 CLR 并执行您的托管代码
  3. 离开自定义操作时,卸载 dll 并关闭 clr
每次调用自定义操作都会执行此操作。这是自定义操作通常使用 C++ 编写的主要原因之一。
为了更灵活,您应该使用 WIX 工具包,它允许与 MSI 一样良好地集成 .NET。MSI 本身对 .NET 一无所知,是一个独立的世界。 MSI 本身通过诸如 DialogControl 表格来定义对话框和控件。 您可以创建一个对话框,并在每个需要执行的几个 MSI 操作之间将状态存储在 MSI 属性中,例如计算所选功能的磁盘空间等。但我怀疑这种解决方案的性能,并担心在一个进程中如此频繁地启动和关闭 CLR 将使您面临 CLR 错误,这些错误以前没有人遇到过。
要设置目标位置,您只需调用 MSI 方法 MsiSetTargetPath,然后可以轻松地进行 PInvoke。
为了禁用正常的用户界面,您可以通过 MsiSetExternalUI 完全或部分地覆盖它,但我没有尝试过仅禁用特定对话框。如果您想隐藏特定的对话框,您应该检查当前 MSI 的 msi 表格,以查看是否可以设置一个 msi 属性,使对话框认为它已经被显示过了。
祝好, Alois Kraus

谢谢。 (请原谅我的一知半解)您提到/推荐我应该使用WIX。 维基百科上的快速查看说:“Windows Installer XML(WiX,发音为“wicks”)是一个免费的软件工具集,可以从XML文档构建Windows Installer(MSI)包”,通过阅读此内容,我感觉自己回到了起点。 VS2010设置项目生成.msi。 WIX是否允许我完全自定义我的.msi,就像我想要的那样?(自定义表单可能会进行webService调用,列出选项,根据这些选项采取操作,复制文件,记录文件,创建数据库,执行回滚等) - Rauland
是的,您完全可以做任何MSI允许的事情。但WIX对话框也基于msi对话框和控件表。但您有一个优势,可以使用XML声明它们,而不是使用msi表,这样更容易。但据我所知,这并不能帮助您用基于.Net的Windows表单替换msi对话框。 - Alois Kraus

1
据我所知,使用Visual Studio创建的安装程序非常有限,除非您使用自定义操作。这些自定义操作可能需要很长时间来创建和调试,因此使用更成熟/功能更强大的工具,如Installshield可能更明智。 编辑 关于使用winforms显示窗口:那是可以的,但是:一个好的安装程序允许静默/脚本安装,请确保您允许这样做。另一件要注意的事情是机器上没有.NET,因此无法显示窗体...在我看来,这是不可接受的,除非您确定.NET(正确版本)已经存在。 编辑2 针对一些评论的回应:有一些场景无法使用VISUAL STUDIO设置和部署项目实现。我并不是说Windows Installer不好。例如,尝试制作一个自定义安装程序来决定应用程序将安装在哪里并跳过项目生成的标准窗口。我并不是说自定义操作有限,但在我看来也不容易。
此外,如果您想使用自定义 WinForms 而不是安装程序表单,则必须确保在显示任何 (WinForm) 窗口之前完成 .NET Framework 的引导。这可能是可行的,但如果您想要这样的定制化,您可能会更喜欢一个更灵活的工具。

关于使用WinForms的附加信息已添加 - Emond
@Erno 谢谢。如果我使用静默安装,我的自定义表单会显示吗?在安装之前,我能控制一下是否存在正确的 .net 版本吗? - Rauland
这取决于您如何创建设置。设置具有多个序列(安装、卸载、提交等),还有一个静默/管理员安装。请勿在静默安装中使用表单。您需要添加一些引导程序来检测.NET:http://support.microsoft.com/kb/324733。 - Emond
1
@Erno:-1:在.NET中创建自定义操作非常容易。你为什么说它们很难? - John Saunders
@John Saunders和Mr. Disappointment:请查看我在答案中的第二次编辑。 - Emond
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接