我正在为我的网络应用编写一个安装程序,我正在努力解决卸载程序部分问题。尽管我在我的应用程序安装项目中在Uninstall上创建了一个自定义操作,但InstallerClass设置为true,方法如下:
public override void Uninstall(IDictionary savedState)
{
//MessageBox.Show("Attach debugger!", "Viper.Setup");
Cleanup();
base.Uninstall(savedState);
}
似乎没有调用安装程序类上的。任何想法可能是什么原因?
编辑:我也注意到它不仅没有运行安装程序,而且也没有删除我的主dll文件。更糟糕的是,当我在卸载前一个版本后安装新版本时,这个dll仍然是旧版本(即使安装和卸载成功)答案 0 :(得分:5)
您是否在安装程序的“代码操作”选项卡中包含了安装程序代码的输出?
如果那不是它......
我在过去遇到过类似的问题,发现我需要定义所有4种方法,否则卸载就无法运行。将代码添加到以下模板中:
[RunInstaller(true)]
public class MyInstaller: Installer
{
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
}
希望这有帮助!
答案 1 :(得分:3)
我实际上并不知道为什么你的覆盖卸载无法正常工作。但每当我面对这个问题 我记录了卸载过程。并据此,您可以轻松检查问题所在的位置!以下是按安装程序类生成日志的方法。
private string logFilePath = "C:\\SetupLog.txt";
public void Log(string str)
{
StreamWriter Tex;
try
{
Tex = File.AppendText(this.logFilePath);
Tex.WriteLine(DateTime.Now.ToString() + " " + str);
Tex.Close();
}
catch
{ }
}
并在覆盖函数中调用此方法,如 - >
public override void Uninstall(IDictionary savedState)
{
try
{
base.Uninstall(savedState);
Log("Omg :O it works !");
}
catch(Exception ex)
{
Log(ex.Message.ToString());
}
}
最后,Windows msi ......并不是那么糟糕......不要把它称为垃圾Plz .. :)
答案 2 :(得分:1)
遇到同样的问题。在这里阅读答案,但乍一看误解了dynaclips的有用答案。
您是否在代码操作中包含了安装程序代码的输出 安装程序的选项卡?
所以这里要更清楚,截图...
最后这里有相同的覆盖,但在VB.net中
Public Class Installer1
Public Sub New()
MyBase.New()
'This call is required by the Component Designer.
InitializeComponent()
'Add initialization code after the call to InitializeComponent
End Sub
<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
MyBase.Install(stateSaver)
YourCustomInstallAction2BeRenamed()
End Sub
<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)
MyBase.Commit(savedState)
End Sub
<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Rollback(ByVal savedState As System.Collections.IDictionary)
MyBase.Rollback(savedState)
YourCustomRollbackAction2BeRenamed()
End Sub
<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
MyBase.Uninstall(savedState)
YourCustomDeleteAction2BeRenamed()
End Sub
答案 3 :(得分:1)
我通过设置&#39; InstallerClass&#39;解决了这个问题。我的自定义操作的属性为False。
答案 4 :(得分:0)
我在这里遇到同样的问题......伤到我的头脑,找出原因!事实证明,我的安装项目将服务的主输出设置为“Release”,而我在“Debug”中将项目更改为安装程序。在我将它们设置为相同的那一刻,我的MessageBoxes弹出以显示正在执行的代码...
..您现在可以将项目更新为更简洁的解决方案:)
答案 5 :(得分:0)
我为wpf应用程序创建了一个安装程序项目,类似于您的设置,请参阅here,此处描述的问题对于此主题不太重要。
尽管如此,我遇到了和你描述的问题相同的问题。我有 将该安装程序类放在visual studio安装程序项目中 这会阻止类执行。一切都运作良好 每当安装程序类被放入主应用程序时。
答案 6 :(得分:-1)
我停止使用这些垃圾msi并改为创建了一个zip + cmd脚本。强烈推荐,花了我少10倍来设置并实际工作。