У меня есть пользовательское действие с использованием CAQuietExec, который не работает в определенных сценариях - в файле журнала появляются сообщения об ошибках, которые отлично подходят для меня как разработчика и бесполезны для конечного пользователя. Моя цель - поймать неудавшееся действие и предварительно установить стандартное сообщение об ошибке до откат установки.Wix CustomAction dll
Для этого, основываясь на моих исследованиях, я решил, что мне нужно будет написать собственное собственное dll для действия, поэтому я начал следовать за this tutorial. На этом этапе моя dll регистрирует только тестовое сообщение и пытается передать сообщение об ошибке обратно в диалоговые окна. Однако, когда я компилирую и запускаю msi, ничего не происходит вообще - ничего не регистрируется и сообщений об ошибках нет. Глядя на msi в Orca, это выглядит хорошо для меня, но, как вы можете видеть ниже, тестовая dll должна приводить к тому, что установка прерывается немедленно, если она действительно выполняется, а это не так.
Итак, мой вопрос: я собираюсь предоставить обратную связь пользователю наилучшим образом? И если да, то какие-то идеи, почему мое пользовательское действие не запускается?
Благодарности
CustomAction.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
using System.Collections.ObjectModel;
using System.Management.Automation;
namespace MyCustomActions
{
public class CustomActions
{
[CustomAction]
public static ActionResult CustomAction1(Session session)
{
session.Log("Begin CustomAction1");
DisplayMSIError(session, "A test message");
return ActionResult.Failure;
}
static void DisplayMSIError(Session session, String msg)
{
var r = new Record();
r.SetString(0, msg);
session.Message(InstallMessage.Error, r);
}
}
}
Product.wxs
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="MyPackage" Language="1033" Version="0.0.0.1" Manufacturer="Acme" UpgradeCode="GUID">
<Package InstallerVersion="300" Compressed="yes" InstallScope="perMachine" />
<Binary Id="MyCustomActions.CA.dll" src="MyCustomActions\MyCustomActions.CA.dll" />
<CustomAction Id="MyCustomActionsTest"
Return="check"
Execute="immediate"
BinaryKey="MyCustomActions.CA.dll"
DllEntry="CustomAction1" />
<InstallExecuteSequence>
<Custom Action="MyCustomActionsTest" After="LaunchConditions" />
...
</InstallExecuteSequence>
</Product>
</Wix>
Я думаю, что, может быть, вам просто нужно немного больше понимания о том, как свалка работает. Одной из больших идей является тот, с которым вы столкнулись: сначала запускается InstallUISequence, а затем последовательность выполнения, поэтому ваш CA находится после стандартных диалоговых окон пользовательского интерфейса. И нет ничего плохого в session.message, чтобы сообщить пользователю об ошибке. – PhilDW