Отладка : управляемый код относительно прост в отладке (собственный код на самом деле еще проще).Вот несколько указателей:
Предложения : я думаю, у вас просто есть broken reference to the dll export function
- другими словами, ошибочное имя / ссылка на функцию dll:
<CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no"
BinaryKey="CustomActions" DllEntry="__ERRONEOUS FUNCTION REFERENCE__" />
Просто проверьте, что dll на самом деле экспортирует, и сопоставьте так:
<CustomAction Id="CustomAction1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>
Как всегда реальноеMcCoy - это проверка самой библиотеки DLL на наличие правильного имени функции ( снимок экрана ниже из этого предыдущего ответа, рекомендуется прочитать ).
This is a native code C++ dll
:
This is a DTF-packaged managed code dll
:
Обратите внимание, что это нативный dll со встроенным компонентом управляемого кода.Он дает совершенно другой список функций, но вам все равно нужно найти там имя функции, к которому вы обращаетесь.
This is a straight-up managed code dll (no native wrapping)
:
И, наконец, это DLL-библиотека управляемого кода с прямым набором кода без оболочки в собственной оболочке DLL.
Un-UninstallableНастройка : если во время удаления происходит сбой или сбой настраиваемого действия, у вас будут проблемы с удалением установки (она просто откатывается, и вы застряли с установленным).Существует несколько исправлений или обходных путей.
Общее исправление, на мой взгляд, состоит в том, чтобы не вызывать сбой пользовательских действий при удалении или, по крайней мере, обусловить их, чтобы можно было принудительно удалить удаление, задав свойство черезкомандная строка :
Устанавливается в таблице свойств MSI: SUPPRESSERROR = 0
.Затем - при необходимости - в командной строке введите:
msiexec.exe /x {PRODUCT-GUID} SUPPRESSERROR="1"
Внутри MSI вы настраиваете пользовательское действие удаления с помощью:
REMOVE="ALL" AND SUPPRESSERROR="0"
Теперь пользовательское действие не будет запускаться, если SUPPRESSERROR установленкроме 0.
Существует более старый ответ с несколькими дополнительными опциями: Я облажался, как я могу удалить свою программу? (любезно Вим Коенен , ся перепутал его ответ с дополнительными предложениями).
Boilerplate : Для быстрого использования, позвольте мне просто выбросить шаблонный тестовый проект специального действия для специальных действийВот.Предполагается, что проект настраиваемого действия управляемого кода на C # "CustomAction1"
в том же решении Visual Studio и ссылка на него добавляются в исходный код WiX - как вы, очевидно, уже сделали (это будет позже, когда у нас будут всезабыл в чем проблема и нужно еще раз протестировать):
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="WiXCustomActionsTesting" Language="1033" Version="1.0.0.0"
Manufacturer="test" UpgradeCode="PUT-GUID-HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<UIRef Id="WixUI_Mondo" />
<Property Id="SUPPRESSERROR" Value="0" Secure="yes" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<Feature Id="ProductFeature" Title="WiXCustomActionsTesting" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<!--BEGIN CUSTOM ACTION SECTION-->
<Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />
<CustomAction Id="TestUninstallation" Return="check" Execute="deferred" Impersonate="no" BinaryKey="CustomActions" DllEntry="CustomAction1" />
<InstallUISequence></InstallUISequence>
<InstallExecuteSequence>
<Custom Action='TestUninstallation' After='InstallInitialize'></Custom>
</InstallExecuteSequence>
<!--END CUSTOM ACTION SECTION-->
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="WiXCustomActionsTesting" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component>
<File Source="C:\Projects\MySetup\MyApp.exe">
</File>
</Component>
</ComponentGroup>
</Fragment>
</Wix>
- Создать проект WiX
- Скопировать, вставить код, установить новый GUID обновления
- СоздатьПроект CustomAction, имя по умолчанию
- Добавление ссылки на проект настраиваемого действия из проекта wix
- Добавление ссылки на WiXUIExtension.dll
- Настройка пути к файлу в компоненте
- Компиляция