2013-04-08 6 views
0

Мне нужно включить dll/exe в полученный MSI (созданный через проект WiX), но я не хочу их разворачивать во время установки: Я только хотите использовать их в некоторых CustomAction , моя цель - включить существующую exe/dll и вызвать ее во время установки из кода wxs (а не из DLL CustomAction).
Можно ли включать файлы, которые не были развернуты во время установки? Я имею в виду, только упакуйте их внутри результирующего MSI и вызовите их для выполнения какой-либо задачи, пока они распакованы внутри папки% temp%?
Кроме того, было бы неплохо, если бы кто-нибудь мог показать пример кода того, как включить dll/exe через блок кода продукта Product.wxs.
Спасибо.WiX: как упаковать exe или dll для использования только во время установки

+0

Какой язык вы планируете писать пользовательские действия в? –

+0

CustomActions написаны на C#. – woohoo

ответ

2

Да, включите их, используя элемент Binary.

<Binary Id='MyCustomActionBinary' 
     SourceFile='$(var.CustomActionProject.TargetPath)' /> 

Это позволит сделать их доступными для вашего CustomAction, где вы можете использовать атрибут BinaryKey ссылаться на Binary:

<CustomAction Id='MyCustomAction' 
       BinaryKey='MyCustomActionBinary' 
       DllEntry='MyCustomFunction' 
       Execute='deferred' /> 
+0

Конечно, можно. Но инфраструктура, позволяющая получить доступную квоту, вызывается и очищается, значительна. C#/DTF позволяет вам инкапсулировать все это внутри пользовательского действия, чтобы упростить историю. –

+0

Фактически, это то, что я искал, возможно, я был не очень ясен: моя цель - включить существующую exe/dll - и вызвать ее во время установки из кода wxs (а не из DLL CustomAction). – woohoo

+0

Если ваш EXE имеет зависимость, это не сработает. –

1

Если вы используете C#/DTF для написания пользовательского действия, вы просто добавляете DLL в качестве ссылок. Для любого другого типа файлов вы добавляете их в проект как Content | CopyAlways и сборка будут автоматически включать эти файлы в самостоятельное извлечение пользовательских действий. Они будут доступны в текущем каталоге (каталог temp), когда CA запускается и автоматически очищается, когда CA заканчивается.

+0

Извините, может быть, я недостаточно ясен: я не хочу включать их в CustomAction.CA.dll, я хочу, чтобы они включались в код Product.wxs. – woohoo

+0

Почему? Поймите, что вам просто придется изобретать всю эту инфраструктуру, если вы это сделаете. Если вы вызываете EXE, вероятно, вы должны использовать QuietExecCA. Если вы вызываете DLL, вы должны добавить его в качестве ссылки. В противном случае вам нужно написать весь код для извлечения из бинарной таблицы, использовать отражение, чтобы вызвать его, а затем очистить. У меня должна быть очень, очень веская причина, чтобы сделать все это вместо того, чтобы использовать встроенные функции. –

+0

ОК, я понял, тогда я не буду вызывать внешнюю exe/dll из пользовательских действий. Я буду называть их только кодом wxs. Спасибо за ответ в любом случае, он многое разъяснил мне :) – woohoo