很抱歉这是一个很长的问题,但我必须尽可能多地提供详细信息,以帮助您更好地理解这个问题。
我使用InstallShield 2012创建的msi安装程序,它在大多数计算机上都能正常运行,但在某些计算机上我得到了通用的1001错误,在点击该错误后,所有内容都回滚了。要进行故障排除,我运行以下代码以从安装
生成调试日志Setup.exe /v"/l*v \"C:\log.dat\""
调试日志显示错误2769,自定义操作xxxx.install未关闭1 MSIHANDLES。
在谷歌上搜索这个问题时,我发现很多人都有这个完全相同的错误,大部分建议都是为了检查你的自定义操作正在做什么,因为它是产生此错误的那个。
以下是我迄今为止排除和解决此问题所做的工作:
根据什么是.NET安装程序类?你可以从InstallShield看下面的注释。
使用我的自定义操作代码担心某些内容不对,我进行了一些调试日志记录并再次运行整个安装,我仍然收到相同的错误,但我没有看到任何异常被记录。该服务实际上已成功创建,我甚至可以运行它,只要我没有在1001错误上单击确定,这将触发回滚并卸载此服务。
public ProjectInstaller()
{
try
{
using (StreamWriter w = File.AppendText("c:\\log.txt"))
{
Log("start installing", w);
}
InitializeComponent();
using (StreamWriter w = File.AppendText("c:\\log.txt"))
{
Log("End Install", w);
}
}
catch (Exception ex)
{
using (StreamWriter w = File.AppendText("c:\\log.txt"))
{
Log(ex.Message, w);
Log(ex.StackTrace, w);
}
}
}
private void InitializeComponent()
{
this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
//
// serviceProcessInstaller1
//
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
//
// serviceInstaller1
//
this.serviceInstaller1.Description = "Healthcare Platform Service";
this.serviceInstaller1.ServiceName = "psService";
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
//
// ProjectInstaller
//
this.Installers.AddRange(new System.Configuration.Install.Installer[] {
this.serviceProcessInstaller1,
this.serviceInstaller1});
}
根据我到目前为止的疑难解答,我不认为错误在自定义操作代码中。然而,这真的让我感到不知所措,因为我真的不知道导致自定义操作失败的原因;看起来有些东西没有关闭msi手柄,但这对我来说真的是一个黑盒子.....
所以不知道这可能是什么? 我怎样才能进一步深入研究这个客户行为的问题_502E509F9B6F6675DFF9C310662BC1B5.install?
以下是自定义操作序列。
*编辑: 我发现link谈到我遇到的类似错误...但是我确认我的自定义操作没有任何参数,并且根据我的详细调试日志,我看到所有路径都已正确解析。
**编辑:添加自定义动作序列截图。
答案 0 :(得分:2)
错误是由于安装程序类的基础结构不起作用而导致的错误。这主要是为Visual Studio安装项目开发的黑盒子。它使用对ManagedInstall的C ++ Dll调用,然后加载框架版本,定位程序集,使用反射实例化您的类,然后调用Install方法。 InstallUtilLib是特定于体系结构的,它与托管代码和框架版本之间的不匹配将导致错误。如果这只发生在一台机器上,可能是这种不匹配,或者该机器在某种程度上与该服务有关。
这只是可能有用的信息。但是,如果您有实际的InstallShield 2012,则根本不需要安装程序类。它们是为Visual Studio设置创建的,几乎所有其他MSI构建工具都不需要它们,因为它们具有对MSI ServiceInstall和ServiceControl表的内置支持。
答案 1 :(得分:1)
引用Jerry MaGuire ...停止,你让我在1001.必须不惜一切代价避免使用InstallUtil管理的自定义操作。第一个操作是通过使用本机Windows安装程序功能来消除对自定义操作的需要。如果仍需要自定义操作,则第二个操作是使用Windows Installer XML(Wix)部署工具基础(DTF)进行重构。将托管代码与MSI集成是一种更好的模式。它适用于InstallShield。
IMO,InstallShield应该从未如此简单地连接InstallUtil自定义操作。毫无疑问,他们这样做是为了满足客户的要求并简化向InstallShield的迁移,但却牺牲了质量标准。
答案 2 :(得分:0)
我真的需要看看它的排序方式。如果这是延迟的,在安装初始化之前或安装完成之后,这可能是一个问题。
答案 3 :(得分:0)
嗯,
这很有趣......我找到了一个谈论事件源的Microsoft link
默认情况下,如果我卸载我的软件,事件源也会被删除。由于某些原因,我认为并非如此,我认为它没有被删除,因为EventMessageFile指向的文件正在被使用/卸载?
所以阅读上面的文章,我去了手动找到的注册表 计算机\ HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志\ MyProgramName
删除上述注册表后,安装不再给我1001错误。看起来InstallShield尝试安装窗口服务,但是在查看此注册表时,它认为服务已经存在(即使它不存在)。