WiX Toolset: как сохранить файл из двоичной таблицы в настраиваемом действии - PullRequest
0 голосов
/ 18 мая 2018

Я хочу сохранить файл из двоичной таблицы во временную папку в Custom Action.У меня есть два пользовательских действия, первое «немедленное», другое «отложенное».

Когда во время выполнения «немедленного» пользовательского действия я вызываю метод Microsoft.Deployment.WindowsInstaller.Record.GetStream, он выполняетне сохранять файл.

[CustomAction]
public static ActionResult ImmediateAction(Session session)
{
    try
    {
        View view = db.OpenView("SELECT Name, Data FROM Binary");
        view.Execute();

        foreach (Record row in view)
        {
            row.GetStream("Data", Path.Combine(Environment.GetEnvironmentVariable("temp"), row.GetString("Name"));
        }

        return ActionResult.Success;
    }
    catch (Exception ex)
    {
        session.Log(ex.Message);
        return ActionResult.Failure;
    }
    finally
    {
        db.Close();
    }
}

Настраиваемое действие работает без ошибок, но файл не создается.

Обновление:

В InstallExecuteSequence настраиваемое действиеописывается так:

    <InstallExecuteSequence>
       <Custom Action="ImmediateAction"
             Before="DeferredAction">
          NOT Installed
        </Custom>

        <Custom Action="DeferredAction"
             After="InstallInitialize">
          NOT Installed
        </Custom>
   </InstallExecuteSequence>

Из пользовательского действия 'deferred' я не могу получить представление db, которое ожидается.И я не могу передать двоичные данные файла из «немедленного» в «отложенное» настраиваемое действие, поскольку класс System.IO.Stream не поддерживает сериализацию.

1 Ответ

0 голосов
/ 21 мая 2018

Отлично, Алекс.Спасибо за ответ.Решение исходного вопроса состояло в том, чтобы вызвать метод Fetch () объекта View (): https://msdn.microsoft.com/en-us/library/windows/desktop/aa372509(v=vs.85).aspx

tempFile = Path.GetTempFileName(); 
using (View binaryView = session.Database.OpenView("SELECT Name, Data FROM Binary")) 
{ 
    binaryView.Execute(); 
    using (Record binaryRec = binaryView.Fetch()) 
    { 
        binaryRec.GetStream(2, tempFile); 
    } 
}
...