2010-02-18 4 views
9

Sto scavando intorno a Google cercando di trovare il modo appropriato per determinare il percorso di installazione selezionato da un utente dalla procedura guidata di installazione.Progetto di installazione di Visual Studio: Ottieni directory di destinazione

Fondamentalmente sto riscontrando un problema in cui il mio servizio non è in grado di creare file nella propria directory perché non dispone delle autorizzazioni appropriate. Sto assumendo che il modo corretto per risolvere questo è quello di assicurarsi che qualsiasi account che il servizio sta usando sia dotato di autorizzazioni appropriate per i file nella sua cartella.

Ma prima posso anche affrontare come impostare le autorizzazioni tramite .Net Ho bisogno di conoscere la cartella di installazione. Sto usando un progetto di installazione che ha una classe Installer che contiene anche un controllo ServiceInstaller. Entrambi hanno la proprietà Context, quindi l'ho verificato per i parametri disponibili quando l'evento AfterInstall si attiva per ciascuno dei rispettivi programmi di installazione. All'inizio pensavo di vedere il set di proprietà TargetDir ma non è stato il caso. Tuttavia sto vedendo AssemblyPath impostato e puntando all'eseguibile della cartella appropriata.

In sostanza voglio solo fare in modo che questo sia il metodo appropriato dovrei usare:

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

risposta

12

ho scoperto che la soluzione che Berg ha dato funziona per me ad eccezione di utilizzare questo valore per la proprietà CustomActionData:

/TargetDir="[TARGETDIR]\" 

Nota del aggiunta del backslash. Vedi questo article on MSDN.

+1

È inoltre necessario aggiungere uno spazio aggiuntivo dopo il backslash "\". Altrimenti potresti ottenere un'eccezione FileNotFoundException durante l'installazione o la disinstallazione. Vedi [qui] (http://stackoverflow.com/questions/4516256/how-do-i-fix-setup-project-with-custom-action-file-not-found-exception/4522825#4522825) o [qui ] (http://stackoverflow.com/questions/8491095/error-1001-using-custom-installer-with-visual-studio-2008). –

+0

Dove stai usando questo pezzetto di testo? La tua spiegazione non mi è chiara, mi dispiace. Come argomento della riga di comando per il progetto? Da qualche parte nel codice? Anche il collegamento a MSDN è interrotto. Grazie Microsoft! :-) –

+0

Oh, ora capisco. Ho trovato la risposta in un altro post: "Nel progetto di distribuzione, aggiungere un'azione personalizzata per l'installazione e il commit. Per la proprietà CustomActionData per l'azione personalizzata Installa, immettere/Targetdir =" [TARGETDIR] \ "" –

3

La vostra azione personalizzato è un'azione personalizzata differita e solo alcune proprietà sono a sua disposizione, consultare la seguente pagina per maggiori dettagli, http://msdn.microsoft.com/en-us/library/aa370543(VS.85).aspx. Potrebbe essere possibile aggiungere la proprietà TARGETDIR a CustomActionData in Visual Studio 2008; tuttavia, non ho lavorato con Visual Studio 2008 come strumento di creazione.

Fare installazioni complicate in Visual Studio 2008 è molto difficile perché astrae una serie di funzionalità chiave di MSI. Consiglio vivamente di dare un'occhiata a WiX.

Anche se non si utilizza WiX, è necessario scaricare Orca, http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx e utilizzarlo per convalidare l'installazione. Questo ti farà risparmiare ore e ore dopo.

+0

WiX è in grado di installare i servizi di Windows? –

+0

Sì WiX è in grado di installare servizi. Devi solo creare l'elemento ServiceInstall, http://wix.sourceforge.net/manual-wix2/wix_xsd_serviceinstall.htm. I progetti di installazione di WiX e Visual Studio 2008 sono entrambi solo front-end per MSI. Se decidi di andare con WiX suggerirei di leggere, http://msdn.microsoft.com/en-us/library/aa370566(VS.85).aspx e tutte le sue voci secondarie. Ti aiuterà a capire componenti e funzionalità. Inizialmente, ho iniziato a utilizzare Visual Studio 2003 \ 2005 per le nostre installazioni e ho incontrato troppe limitazioni. – LanceSc

+0

Ho dovuto attenermi a un progetto di installazione di Visual Studio per questo progetto, ma +1 per darmi un'alternativa valida alla ricerca in futuro. :) –

0

In alternativa ai progetti di installazione, è possibile utilizzare alcuni servizi di installazione. Penso che con http://installer.codeeffects.com puoi caricare qualsiasi file dal tuo sito Web e metterli nella directory di installazione quando l'utente installa il tuo servizio. Spero che questo ti aiuti.

-1

Per quanto posso dire questo è l'unico modo per determinare la directory di installazione. Naturalmente prenderò nota se qualcuno arriva con una risposta diversa ma fino ad allora questo è l'approccio che sto prendendo.

+1

Questa non è una risposta. Qualunque soluzione tu abbia usato è la risposta. –

0

Per ottenere il valore della proprietà directory di destinazione nella vostra azione personalizzata è possibile inoltrare manualmente selezionando l'output azione personalizzata nella vista un'azione personalizzata e mettere qualcosa di simile:

/TargetDir="[TARGETDIR]" 

come valore per la proprietà CustomActionData .

Si dovrebbe quindi essere in grado di accedervi:

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

Come ho detto nella mia domanda, ho controllato quel valore ma sfortunatamente non è impostato al momento in cui l'evento viene attivato. –

1

Per coloro che hanno più dovrà fare come questo

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

Durante l'installazione, evento mi ha fatto questo:

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

poi, sono stato in grado di accedere TargetDir successivamente durante OnCommitted:

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

Non so se questo aiuti o no! Sto cercando di capire come determinare in modo affidabile la directory di installazione in modo che il mio servizio possa fare un po 'di registrazione.