0

次のWixフラグメントがあります。これは、インストール中かアンインストール中かに応じて、2つのカスタムアクションのいずれかを呼び出します。

<?xml version="1.0" encoding="UTF-8" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include $(sys.CURRENTDIR)\Config.wxi?>
  <Fragment>
    <CustomAction Id="caSetPropertyForInstall" Property="caRegisterDriver" Value="DeviceId=$(var.DriverId);DeviceName=$(var.ChooserName)" />
    <CustomAction Id="caSetPropertyForUninstall" Property="caUnregisterDriver" Value="DeviceId=$(var.DriverId);DeviceName=$(var.ChooserName)" />
    <Binary Id="DriverRegCA" SourceFile="$(var.ASCOM.Wix.CustomActions.TargetDir)\$(var.ASCOM.Wix.CustomActions.TargetName).CA.dll" />
    <CustomAction Id="caRegisterDriver" BinaryKey="DriverRegCA" DllEntry="RegisterAscomDriver" Execute="deferred" Return="check" />
    <CustomAction Id="caUnregisterDriver" BinaryKey="DriverRegCA" DllEntry="UnregisterAscomDriver" Execute="immediate" Return="ignore" />
    <InstallExecuteSequence>
      <Custom Action="caSetPropertyForInstall" Before="caRegisterDriver" />
      <Custom Action="caSetPropertyForUninstall" Before="caUnregisterDriver" />

      <!-- Execute during install -->
      <Custom Action="caRegisterDriver" Before="InstallFinalize">NOT Installed</Custom>

      <!-- Execute during uninstall -->
      <Custom Action="caUnregisterDriver" Before="RemoveFiles">REMOVE ~= "ALL"</Custom>
    </InstallExecuteSequence>
  </Fragment>
</Wix>

インストールCAは期待どおりに機能します。アクションId=caSetpropertyForInstallでいくつかのプロパティを設定すると、アクションcaRegisterDriverがC#管理のカスタムアクションを呼び出します。C#コードは、次のようにカスタムアクションプロパティをクエリします。

var deviceId = session.CustomActionData["DeviceId"];
var deviceName = session.CustomActionData["DeviceName"];
Diagnostics.TraceInfo("Property DeviceId = [{0}]", deviceId);
Diagnostics.TraceInfo("Property DeviceName = [{0}]", deviceName);

インストールでもアンインストールでも同じC#メソッドが使用され、すでに述べたように、これはインストールフェーズで機能します。

私の問題は、アンインストールフェーズ中に例外が発生することです。

1 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe ===== TiGra.Diagnosticsが初期化されました:デフォルトのTraceLevel=警告=====
2 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe ASCOM.Wix.CustomActions.CustomActions [Info]:UnregisterAscomDriverカスタムアクションを開始します
3 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe ASCOM.Wix.CustomActions.CustomActions [エラー]:インストーラーのプロパティのクエリ中にエラーが発生しました
4 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe ASCOM.Wix.CustomActions.CustomActions [エラー]:System.Collections.Generic.KeyNotFoundException:指定されたキーがディクショナリに存在しませんでした。
5 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at System.ThrowHelper.ThrowKeyNotFoundException()
6 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
7 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at Microsoft.Deployment.WindowsInstaller.CustomActionData.get_Item(String key)
8 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at ASCOM.Wix.CustomActions.CustomActions.CreateAscomDeviceFromSessionProperties(IInstallerPropertyProvider session)
9 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe ASCOM.Wix.CustomActions.CustomActions [エラー]:UnregisterAscomDriverが失敗しました:System.Collections.Generic.KeyNotFoundException:指定されたキーが存在しませんでした辞書で。
10 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at System.ThrowHelper.ThrowKeyNotFoundException()
11 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
12 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at Microsoft.Deployment.WindowsInstaller.CustomActionData.get_Item(String key)
13 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at ASCOM.Wix.CustomActions.CustomActions.CreateAscomDeviceFromSessionProperties(IInstallerPropertyProvider session)
14 23/01/2013 03:07:37 7120 C:\ Windows \ SysWOW64 \ rundll32.exe at ASCOM.Wix.CustomActions.CustomActions.UnregisterAscomDriver(Session session)

インストールとアンインストールの処理方法に違いが見当たらないので、なぜそうなのか戸惑います。明らかな何かが欠けていますか?

4

1 に答える 1

3

カスタムアクション「caUnregisterDriver」が、遅延実行ではなく即時実行するようにスケジュールされています。コレクションに逆シリアル化するためのCustomActionDataプロパティはありません。

ところで、ロールバックとコミットのカスタムアクションも表示されないので、それについても心配します。

于 2013-01-23T03:37:38.060 に答える