2009-12-15 8 views
5

Sto creando un'attività MSBuild che leggerà il registro per una chiave di registro specifica. Se scrivo la stessa riga di codice (vedi sotto) in un'applicazione console, restituisce il risultato previsto, ma quando si trova all'interno dell'attività MSBuild, non restituisce nulla.Come si legge un valore di registro utilizzando un'attività msbuild personalizzata?

Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing) 

mi aspetterei che il codice di cui sopra per tornare Nothing se la coppia chiave/valore non esiste, e restituire il valore se esiste. Sto ottenendo Nothing quando viene eseguita l'attività MSBuild. C'è qualche attributo che devo applicare alla funzione Execute dell'attività di MSBuild per dirgli che ha bisogno di leggere il registro?

EDIT:

Qui è quanto viene avviato dal compito MSBuild:

Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing) 

ho credere questo per essere causato dalla Registry Redirector sulla mia macchina Vista x64 in esecuzione MSBuild a 32 bit. C'è un modo in cui puoi dire all'attività personalizzata di MSBuild (scritta in VB .Net) di cercare in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\ quindi solo se non esiste nulla allora guarda in HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\?

Grazie,

Scott Blu

+0

hai provato uno strumento come RegMon per assicurarti di leggere la chiave di registro corretta quando viene colpito da MSBuild? Potrebbero esserci dei munging a 32-bit/64-bit? –

+0

Buon pensiero, vedrò quello ... – Scott

+0

Quindi, 'RegMon' è sostituito da' Process Monitor' e segnala che quando uso l'applicazione console per leggere il registro è una lettura di successo via TestingRegistry. exe (nome del programma). Ma quando eseguo l'attività, utilizza show devenv.exe come applicazione chiamante e sta effettivamente tentando di aprire questa chiave: 'HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup' e ottenere un errore' NAME NOT FOUND'. Perché dovrebbe aggiungere un elemento 'Wow6432Node' nel percorso? – Scott

risposta

0

ne dite di usare la funzione If() ternario di VB?

Function GetSqlPathFromReg() As Object 
    Return If(Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing), _ 
       Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing)) 
End Function 

Supponendo di avere una proprietà Output():

Private _sqlPath As String 

<Output()> _ 
Public ReadOnly Property SqlPath() As String 
    Get 
     Return _sqlPath 
    End Get 
End Property 

Poi tutto quello che dovete fare è chiamarlo dal metodo Execute():

_sqlPath = GetSqlPathFromReg().ToString() 
+0

Buona idea, ma non funziona. A causa del Registry Redirector, 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSSQLServer \ Setup \' viene convertito automaticamente in 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \', quindi la tua soluzione sarebbe effettivamente: 'Return If (Registry .GetValue ("HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \", "SQLPath", Nothing), _ Registry.GetValue ("HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \", "SQLPath", Niente)) ' Wow6432Node viene iniettato automaticamente. – Scott

+0

Forse hai solo bisogno di cercare in una posizione diversa, vedi: http://support.microsoft.com/kb/936491 – KMoraz

12

È possibile leggere il registro direttamente da MSBuild , senza un'attività personalizzata, come questa:

$(registry:Hive\MyKey\[email protected]) 

esempio

$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\) 

Lei ha detto che si sta cercando di fare questo da un'attività personalizzata, quindi questo non può applicare, ma sto postando in caso aiuta.

+0

ma si applicava a me !!! grazie. –

1

Il nostro script msbuild viene eseguito da un prompt dei comandi di Visual Studio x86. Non legge il registro a 64 bit quando si utilizza questa sintassi. C'è una sintassi diversa che consentirebbe a x86 di leggere il registro a 64 bit?

Problemi correlati