Wix Пользовательские действия run dll c# - PullRequest
1 голос
/ 25 марта 2020

Я использую пользовательское действие для запуска функции из dll, но когда я запускаю созданную мной msi, я получаю сообщение об ошибке:

"Возникла проблема с этим windows установочным пакетом. Не удалось запустить DLL, необходимую для завершения этой установки. Обратитесь в службу поддержки ... "

Это то, что я сделал:

       <Fragment>
<UI>
  <Dialog Id="UserRegistrationDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">

    <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&amp;Next">
      <Publish Event="DoAction" Value="MyCustomAction">1</Publish>
      <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
      <Publish Event="NewDialog" Value="SetupTypeDlg">ProductID</Publish>
    </Control>
    <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="Cancel">
      <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
    </Control>
    <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" />
    <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
      <Text>Please enter your customer information</Text>
    </Control>
    <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
    <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
      <Text>{\WixUI_Font_Title}Customer Information</Text>
    </Control>
    <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />

  <Control Id="PlatformCombobox" Type="ComboBox" X="45" Y="127" Width="220" Height="18" ComboList="yes" Sorted="yes" Property="Platform">
    <ComboBox Property="Platform">
      <ListItem Value="1" Text="1"/>
      <ListItem Value="2" Text="2 "/>
      <ListItem Value="3" Text="3 "/>
      <ListItem Value="4" Text="4 "/>
    </ComboBox>
  </Control>
  </Dialog>
</UI>
    <Property Id="Platform" Value="2" />

    <CustomAction Id='MyCustomAction' BinaryKey='CreateFile' DllEntry='CreateFile'/>
    <Binary Id='CreateFile' SourceFile='SetupDll.dll'/>


  </Fragment>

Как видите, я пытаюсь запустите SetupDll.dll, который содержит 1 класс с 1 функцией:

using System.IO;
using Microsoft.Deployment.WindowsInstaller;

namespace SetupDll
{
    public class Creator
    {
        [CustomAction]
        public static ActionResult CreateFile(Session session)
        {
            File.WriteAllText(@"C:\a.txt", "123");
            return ActionResult.Success;
        }
    }
}

Но я не понимаю проблемы. Я поместил полученный файл SetupDll.dll в каждую папку проекта wix.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

MakeSfxCA.exe : FileName.CA.dll dll по сути является связкой ваших. NET управляемых кодов dll и зависимостей, и имитирует реальный dll, чтобы MSI мог обрабатывать его как пользовательское действие. Это сделано с использованием файла с именем MakeSfxCA.exe - Здесь есть некоторые детали (см. Также ответ № 2 в этой «теме»).

Если вы все делаете правильно в Visual Studio WiX / Votive, эта компиляция автоматически использует MakeSfxCA.exe для вас. См. Снимок экрана в приведенной выше ссылке.

Ниже приведены примеры использования управляемого кода:

Inline, суть , Обратите внимание на ".CA.dll" в конце строки для двоичного элемента :

<..>

<!-- Point to custom action binary -->
<Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />

<!-- Specify custom action name in above binary -->
<CustomAction Id="CA1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>

<!-- Insert custom action in GUI sequence -->
<InstallUISequence>
  <Custom Action="CA1" After="CostFinalize" />
</InstallUISequence>

<!-- Insert custom action in install sequence -->
<InstallExecuteSequence>
  <Custom Action="CA1" After="CostFinalize" />
</InstallExecuteSequence>

<..>
0 голосов
/ 25 марта 2020

Бинарный элемент должен указывать на SetupDll.CA.dll, а не на SetupDll.dll.

...