Мне нужно включить dll/exe в полученный MSI (созданный через проект WiX), но я не хочу их разворачивать во время установки:
Я только хотите использовать их в некоторых CustomAction
, моя цель - включить существующую exe/dll и вызвать ее во время установки из кода wxs (а не из DLL CustomAction).
Можно ли включать файлы, которые не были развернуты во время установки? Я имею в виду, только упакуйте их внутри результирующего MSI и вызовите их для выполнения какой-либо задачи, пока они распакованы внутри папки% temp%?
Кроме того, было бы неплохо, если бы кто-нибудь мог показать пример кода того, как включить dll/exe через блок кода продукта Product.wxs.
Спасибо.WiX: как упаковать exe или dll для использования только во время установки
ответ
Да, включите их, используя элемент Binary.
<Binary Id='MyCustomActionBinary'
SourceFile='$(var.CustomActionProject.TargetPath)' />
Это позволит сделать их доступными для вашего CustomAction, где вы можете использовать атрибут BinaryKey ссылаться на Binary:
<CustomAction Id='MyCustomAction'
BinaryKey='MyCustomActionBinary'
DllEntry='MyCustomFunction'
Execute='deferred' />
Конечно, можно. Но инфраструктура, позволяющая получить доступную квоту, вызывается и очищается, значительна. C#/DTF позволяет вам инкапсулировать все это внутри пользовательского действия, чтобы упростить историю. –
Фактически, это то, что я искал, возможно, я был не очень ясен: моя цель - включить существующую exe/dll - и вызвать ее во время установки из кода wxs (а не из DLL CustomAction). – woohoo
Если ваш EXE имеет зависимость, это не сработает. –
Если вы используете C#/DTF для написания пользовательского действия, вы просто добавляете DLL в качестве ссылок. Для любого другого типа файлов вы добавляете их в проект как Content | CopyAlways и сборка будут автоматически включать эти файлы в самостоятельное извлечение пользовательских действий. Они будут доступны в текущем каталоге (каталог temp), когда CA запускается и автоматически очищается, когда CA заканчивается.
Извините, может быть, я недостаточно ясен: я не хочу включать их в CustomAction.CA.dll, я хочу, чтобы они включались в код Product.wxs. – woohoo
Почему? Поймите, что вам просто придется изобретать всю эту инфраструктуру, если вы это сделаете. Если вы вызываете EXE, вероятно, вы должны использовать QuietExecCA. Если вы вызываете DLL, вы должны добавить его в качестве ссылки. В противном случае вам нужно написать весь код для извлечения из бинарной таблицы, использовать отражение, чтобы вызвать его, а затем очистить. У меня должна быть очень, очень веская причина, чтобы сделать все это вместо того, чтобы использовать встроенные функции. –
ОК, я понял, тогда я не буду вызывать внешнюю exe/dll из пользовательских действий. Я буду называть их только кодом wxs. Спасибо за ответ в любом случае, он многое разъяснил мне :) – woohoo
Какой язык вы планируете писать пользовательские действия в? –
CustomActions написаны на C#. – woohoo