我有一个 MSI 设置来安装和卸载我的Windows服务应用程序..我已经编写代码来删除卸载功能中的Windows服务..这里,我的问题是,MSI设置尝试在卸载函数调用之前删除文件,然后我收到以下警告信息:
我的安装程序类代码:
[RunInstaller(true)]
public partial class Installer1 : Installer
{
public Installer1()
{
InitializeComponent();
}
public override void Install(IDictionary savedState)
{
base.Install(savedState);
//Add custom code here
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
//Add custom code here
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
Program.InstallService();
}
public override void Uninstall(IDictionary savedState)
{
Program.UnInstallService();
base.Uninstall(savedState);
}
}
任何人都可以帮助我绕过这个错误消息吗?
答案 0 :(得分:1)
您不必使用安装程序类来处理Windows服务的安装/卸载。 MSI能够处理安装/卸载。
1)
您必须将服务安装程序类添加到Windows服务项目中。为此,在设计模式下打开服务类,右键单击设计视图和“查找添加安装程序”选项。添加类后,需要转到服务安装程序类的属性并进行必要的更改(服务名称等)。
[2]
转到Windows服务安装程序项目(MSI)的FileSystemEditor视图,您应该看到在安装期间将部署的任何dll或任何其他文件。右键单击并选择Add
> Project Output
。在弹出窗口中选择" Primary Output"并选择您的Windows服务项目。
[3]
检查安装程序项目,然后选择解决方案资源管理器窗口顶部的Custom Actions Editor
选项。现在您将在左侧看到Install / Uninstall / Rollback / Commit操作。右键单击每个操作,弹出窗口将显示,选择Application Folder
并选择您在步骤2中添加的主输出。当您安装/卸载MSI Windows服务时,现在重建MSI项目也将安装/自动卸载。
答案 1 :(得分:0)
Visual Studio部署项目的许多问题之一是它无法公开底层的Windows Installer ServiceInstall和Service控制表。如果你使用这些,你可能没有任何问题,因为本机功能非常好。像ServiceInstaller这样的自定义操作通常会使用更脆弱的解决方案重新发明轮子。
这里最好的做法是将您的服务纳入使用Windows Installer XML(WiX)创作的合并模块。然后在MSI项目中使用此合并模块。这样您就不需要任何自定义操作,只是有效。
或者,只需完全摆脱此项目类型并使用WiX重写您的安装程序。我维护了一个名为Industrial Strength Windows Installer XML(IsWiX)的开源项目,编写这样的安装程序只需要几分钟。您可以在以下位置查看演示:
答案 2 :(得分:0)
该对话框没有告诉您MSI正在尝试在卸载之前删除文件 - 它只是一个正在使用的文件对话框,告诉您该服务以及它加载的任何Dll都在使用中,不会被删除。它会提示您在服务继续之前停止服务并且无法删除正在运行的服务
在Visual Studio安装项目的有限环境中(显然你正在使用它),你似乎做错了。 Base.Uninstall()将卸载该服务 - 您不需要这样做,并且Base.Uninstall将在删除文件之前运行。甚至有可能你的不必要的Program.UninstallService导致了问题,但当然我们无法看到代码。所有大多数人都添加到Base.Uninstall是关闭服务并等待它完全完成的代码。如果您没有正确关闭手柄,这也将是一个问题。如果您的代码中没有(例如)执行ServiceConteroller.Close(),那么您将看到此消息,因为您的代码具有对服务的引用。