Как вы читаете значение реестра с помощью пользовательской задачи msbuild? - PullRequest
5 голосов
/ 15 декабря 2009

Я создаю задачу MSBuild, которая будет читать реестр для определенного раздела реестра. Если я пишу ту же строку кода (см. Ниже) в консольном приложении, он возвращает ожидаемый результат, но когда он находится в задаче MSBuild, он ничего не возвращает.

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

Я ожидаю, что приведенный выше код вернет Nothing, если пары ключ / значение не существует, и вернет значение, если оно существует. Я получаю Nothing при выполнении задачи MSBuild. Есть ли какой-то атрибут, который мне нужно применить к функции «Выполнить» задачи MSBuild, чтобы сообщить ей, что ей нужно прочитать реестр?

EDIT:

Вот что выполняется из задачи MSBuild:

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

Я полагаю, что это вызвано перенаправителем реестра на моей машине Vista x64 с MSBuild в 32-битной версии. Можно ли как-нибудь сказать, что пользовательская задача MSBuild (написанная на VB .Net) должна искать в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\ тогда, только если там ничего не существует, тогда искать в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\?

Спасибо,

Скотт Блю

Ответы [ 3 ]

13 голосов
/ 31 декабря 2009

Вы можете прочитать реестр напрямую из MSBuild, без специальной задачи, например:

$(registry:Hive\MyKey\MySubKey@Value)

например.,

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

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

2 голосов
/ 12 февраля 2010

Наш скрипт msbuild запускается из командной строки Visual Studio x86. Он не читает 64-битный реестр при использовании этого синтаксиса. Есть ли другой синтаксис, который позволил бы x86 читать 64-битный реестр?

0 голосов
/ 16 декабря 2009

Как насчет использования VB's If () троичная функция?

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

Если у вас есть свойство Output():

Private _sqlPath As String

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

Тогда все, что вам нужно сделать, это вызвать его из Execute() метода:

_sqlPath = GetSqlPathFromReg().ToString()
...