2010-02-18 6 views
9

Я искал Google, пытаясь найти подходящий способ определить путь установки, выбранный пользователем, из мастера установки.Проект установки Visual Studio: получить целевой каталог

В основном я столкнулся с проблемой, когда моя служба не может создавать файлы в своем собственном каталоге, поскольку ей не хватает соответствующих разрешений. Я предполагаю, что это правильный способ разрешить это, чтобы удостовериться, что в любой учетной записи, используемой службой, предоставляются соответствующие разрешения для файлов в ее папке.

Но прежде чем я могу даже решить, как установить разрешения через .Net Мне нужно знать папку установки. Я использую проект установки, который имеет класс Installer, который также содержит элемент управления ServiceInstaller. Оба имеют свойство Context, поэтому я проверял, что для параметров, которые доступны, когда событие AfterInstall срабатывает для каждого из соответствующих установщиков. Сначала я думал, что увижу набор свойств TargetDir, но этого не произошло. Однако я вижу AssemblyPath и указываю на исполняемый файл соответствующей папки.

По сути, я просто хочу, чтобы убедиться, что это подходящий метод, который я должен использовать:

private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) 
{ 
    string InstallPath = System.IO.Path.GetDirectoryName(serviceInstaller1.Context.Parameters["AssemblyPath"]);; 
} 

ответ

12

Я обнаружил, что решение, которое Берг дал работы для меня, за исключением использования этого значения для свойства CustomActionData:

/TargetDir="[TARGETDIR]\" 

Записки добавление обратной косой черты. См. Это article on MSDN.

+1

Вы также должны добавить дополнительное пространство после обратной косой черты «\». В противном случае вы можете получить исключение FileNotFoundException при установке или удалении. См. [Здесь] (http://stackoverflow.com/questions/4516256/how-do-i-fix-setup-project-with-custom-action-file-not-found-exception/4522825#4522825) или [здесь ] (http://stackoverflow.com/questions/8491095/error-1001-using-custom-installer-with-visual-studio-2008). –

+0

Где вы используете этот бит текста? Ваше объяснение мне не совсем понятно, извините. Как аргумент командной строки для проекта? Где-то в коде? Эта ссылка на MSDN тоже сломана. Спасибо, Microsoft! :-) –

+0

О, я вижу сейчас. Я нашел ответ в другом сообщении: «В вашем проекте развертывания добавьте пользовательское действие для установки и фиксации. Для свойства CustomActionData для пользовательского действия Установить введите/Targetdir =" [TARGETDIR] \ "" –

3

Ваше пользовательское действие является отложенное пользовательское действие, и только некоторые свойства доступны к нему на следующей странице для более подробной информации, http://msdn.microsoft.com/en-us/library/aa370543(VS.85).aspx. Возможно, вы сможете добавить свойство TARGETDIR в CustomActionData в Visual Studio 2008; однако я не работал с Visual Studio 2008 в качестве средства разработки.

Выполнение сложных инсталляций в Visual Studio 2008 очень сложно, поскольку оно абстрагирует ряд ключевых функций MSI. Я настоятельно рекомендую взглянуть на WiX.

Даже если вы не используете WiX, вам нужно загрузить Orca, http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx и использовать его для проверки вашей установки. Это избавит вас от бесчисленных часов.

+0

Может ли WiX устанавливать службы Windows? –

+0

Да WiX способен устанавливать сервисы. Вам просто нужно создать элемент ServiceInstall, http://wix.sourceforge.net/manual-wix2/wix_xsd_serviceinstall.htm. Проекты настройки WiX и Visual Studio 2008 являются как раз передними концами для MSI. Если вы решите пойти с WiX, я бы предложил прочитать, http://msdn.microsoft.com/en-us/library/aa370566(VS.85).aspx и все его подзаголовки. Это поможет вам понять компоненты и функции. Первоначально я начал использовать Visual Studio 2003 \ 2005 для наших установок и просто столкнулся с слишком большим количеством ограничений. – LanceSc

+0

Мне пришлось придерживаться проекта установки Visual Studio для этого проекта, но +1 для того, чтобы дать мне жизнеспособную альтернативу исследованиям в будущем. :) –

0

В качестве альтернативы установочным проектам вы можете использовать некоторые службы построения установщика. Я думаю, что с http://installer.codeeffects.com вы можете загружать любые файлы с вашего сайта и размещать их в каталоге установки, когда пользователь устанавливает вашу службу. Надеюсь это поможет.

-1

Насколько я могу судить, это единственный способ определить каталог установки. Конечно, я буду замечать, что кто-то приходит с другим ответом, но до тех пор это тот подход, который я принимаю.

+1

Это не ответ. Какое бы решение вы использовали, это ответ. –

0

Чтобы получить значение свойства целевого каталога в пользовательском действии вы можете переслать его вручную, выбрав свой собственный вывод действий с точки зрения пользовательского действия и положить что-то вроде:

/TargetDir="[TARGETDIR]" 

в качестве значения для свойства CustomActionData ,

Затем вы должны быть в состоянии получить доступ к ней через:

string targetDir = Context.Parameters[ "TargetDir" ]; 
+0

Как я уже сказал в своем вопросе, я проверил это значение, но, к сожалению, оно не установлено в момент срабатывания события. –

1

Для тех, у кого есть множественный придется делать как этого

/AppID="[APPID]" /Path="[TARGETDIR]\" 
2

Во время установки, события я сделал это:

// locate the installation directory and store it where we can find it during Commit 
stateSaver.Add("TargetDir", Context.Parameters["DP_TargetDir"]); 

тогда, я был в состоянии получить доступ к TargetDir позже во время OnCommitted:

string path = (string)savedState["TargetDir"]; 

Не уверен, что это помогает или нет! Я пытаюсь выяснить, как надежно определить каталог установки, чтобы моя служба могла выполнять некоторые протоколирования.

Смежные вопросы