我的项目中出现自定义操作问题。有些正在工作,有些则没有。我在VS 2012中有两个项目C#CustomAction项目和安装项目。 我的自定义操作看起来像这样。这两个第一个动作不会导致问题。只有第三个不起作用。
[CustomAction]
public static ActionResult WriteToConfigStore(Session session)
{
...
}
[CustomAction]
public static ActionResult CleanConfigStore(Session session)
{
...
}
[CustomAction]
public static ActionResult CheckPrograms(Session session)
{
string s = "";
Process[] p = Process.GetProcesses();
foreach (Process ps in p)
{
s += ps.ProcessName + ";";
}
MessageBox.Show(s);
return ActionResult.Success;
}
我定义了这样的自定义操作:
<Binary Id="CustomActionsId" SourceFile="$(var.ResourcesDir)\DriverCA.CA.dll" />
<CustomAction Id="ca_writeToConfigStoreId" BinaryKey="CustomActionsId" DllEntry="WriteToConfigStore" Execute="deferred" Return="check" />
<CustomAction Id="ca_cleanConfigStoreId" BinaryKey="CustomActionsId" DllEntry="CleanConfigStore" Execute="deferred" Return="check" />
<CustomAction Id="ca_setParameter" Return="check" Property="ca_writeToConfigStoreId" Value="param1=.;param2=;param3=;param4=;param5=IviDriver1.0, IviSwtch1.0" />
<CustomAction Id="ca_setCleanParameter" Return="check" Property="ca_cleanConfigStoreId" Value="param1=;" />
<CustomAction Id="ca_checkProgramsId" BinaryKey="CustomActionsId" DllEntry="CheckPrograms" Execute="deferred" Return="check" />
我的安装顺序如下:
<InstallExecuteSequence>
<Custom Action="ca_setParameter" Before="InstallFinalize" />
<Custom Action="ca_setCleanParameter" Before="InstallFinalize" />
<!--Call only when not uninstall (install, change, repair)-->
<Custom Action="ca_writeToConfigStoreId" After="ca_setParameter">NOT(REMOVE="ALL")</Custom>
<!--Call only when uninstall or upgrade-->
<Custom Action="ca_cleanConfigStoreId" After="ca_setCleanParameter">REMOVE="ALL"</Custom>
<!--Call only when not install-->
<Custom Action="ca_checkProgramsId" After="MsiUnpublishAssemblies">Installed</Custom>
</InstallExecuteSequence>
当我评论<Custom Action="ca_checkProgramsId" After="MsiUnpublishAssemblies">Installed</Custom>
时,一切正常。但是当这部分未被注释掉时,我在卸载程序时遇到了错误There is problem with this Windows Installer package. A DLL required for this install to complete could not be run.
。我看不出任何错误。每个名称和ID都是正确的。我没有使用PInvoke或类似的东西。
更新 自定义操作的目标是检查某些进程是否正在运行,并根据它中断卸载过程。安装是按系统进行的,我在任何其他自定义操作中都没有消息框的问题。我用另一个自定义动作项目解决了它,它本身就有问题自定义动作,但是否则我使用完全相同的方法和设置定义(当然不包括另一个dll定义)仍然不知道问题是什么。
答案 0 :(得分:0)
可能会有所帮助的一些事情:
您可能需要在系统上枚举进程的权限 - 我无法判断您的设置是按用户(因此未提升)还是按系统进行(并通过提升提示进行提升)。
如果自定义操作被提升(并使用系统帐户运行),我不确定您是否可以执行MessageBox.Show,因为将Windows消息循环暴露给桌面是一个安全漏洞。
您认为MsiPublishAssemblies解决后的问题是什么?对我来说,为什么你认为这会有所帮助,这一点并不明显。我不认为它与问题有关,除非您的代码实际上依赖于GAC中的程序集,因为它不会被安装直到InstallFinalize(这是真正重要的,不是发布程序集) )。
答案 1 :(得分:0)
不是真正的答案,但希望不仅仅是评论。
更难调试:
CheckPrograms
以设置虚拟属性并返回ActionResult.Success
。然后使用详细日志记录运行msiexec
以查看是否已达到设置属性的代码。这一切归结为:如果您对可能的错误没有任何想法,尝试逐个简化不同区域的违规代码。
提供更多信息: