2009-12-15 4 views
5

Ich erstelle einen MSBuild-Task, der die Registrierung für einen bestimmten Registrierungsschlüssel liest. Wenn ich dieselbe Codezeile (siehe unten) in einer Konsolenanwendung schreibe, wird das erwartete Ergebnis zurückgegeben. Wenn es sich jedoch innerhalb der MSBuild-Aufgabe befindet, wird nichts zurückgegeben.Wie lesen Sie einen Registrierungswert mithilfe einer benutzerdefinierten Msbuild-Aufgabe?

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

würde ich den obigen Code erwarten Nothing zurück, wenn der Schlüssel/Wert-Paar existiert nicht, und gibt den Wert, wenn es nicht vorhanden ist. Ich bekomme Nothing, wenn der MSBuild-Task ausgeführt wird. Gibt es ein Attribut, das ich auf die Execute-Funktion der MSBuild-Aufgabe anwenden muss, um es zu sagen, dass es die Registrierung lesen muss?

EDIT:

Hier ist das, was aus der MSBuild-Aufgabe ausgeführt wird:

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

Ich glaube, dies durch die Registry Redirector auf meinem Vista x64 Maschine MSBuild verursacht werden in 32-Bit ausgeführt wird. Gibt es eine Möglichkeit, dass Sie die benutzerdefinierte MSBuild Aufgabe (in VB.Net geschrieben) sagen können, in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\ dann nur, wenn nichts existiert dann in HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\ suchen?

Danke,

Scott Blau

+0

haben Sie ein Tool wie RegMon versucht, um sicherzustellen, dass Sie den richtigen Registrierungsschlüssel lesen, wenn es von MSBuild getroffen wird? Könnte es sein, dass 32-Bit/64-Bit Munging läuft? –

+0

Guter Gedanke, ich werde mir das ansehen ... – Scott

+0

Also, 'RegMon' wird durch' Process Monitor' ersetzt und es meldet, dass, wenn ich die Konsolenanwendung zum Lesen der Registrierung verwende, es über TestingRegistry erfolgreich gelesen wird. exe (Programmname). Aber wenn ich den Task ausführe, verwendet er Shows devenv.exe als aufrufende Anwendung und versucht tatsächlich, diesen Schlüssel zu öffnen: 'HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup' und einen' NAME NOT FOUND' Fehler zu erhalten. Warum sollte ein 'Wow6432Node' Element in den Pfad eingefügt werden? – Scott

Antwort

0

Wie wäre es mit If() dreistellige Funktion des 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 

Angenommen, Sie haben eine Output() Eigenschaft:

Private _sqlPath As String 

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

Dann alles, was Sie tun müssen, ist es aus der Execute() Methode aufrufen:

_sqlPath = GetSqlPathFromReg().ToString() 
+0

Guter Gedanke, aber funktioniert nicht. Wegen des Registry Redirectors wird 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSSQLServer \ Setup \' automatisch in 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \' umgewandelt, daher wäre Ihre Lösung effektiv: '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", Nichts)) ' Wow6432Node wird automatisch injiziert. – Scott

+0

Vielleicht müssen Sie nur an einem anderen Ort suchen, siehe hierzu: http://support.microsoft.com/kb/936491 – KMoraz

12

Sie die Registrierung direkt von MSBuild lesen , ohne eine benutzerdefinierte Aufgabe, wie folgt:

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

Z. B.

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

Sie haben gesagt, Sie suchen das aus einer benutzerdefinierten Aufgabe zu tun, so kann dies nicht gelten, aber ich bin Entsendung es, falls es hilft.

+0

aber es galt für mich !!! Danke. –

1

Unser msbuild-Skript wird von einer x86 Visual Studio-Eingabeaufforderung ausgeführt. Es liest die 64-Bit-Registrierung nicht, wenn diese Syntax verwendet wird. Gibt es dort eine andere Syntax, die es dem x86 erlauben würde, die 64-Bit-Registry zu lesen?

Verwandte Themen