如何使用自定义msbuild任务读取注册表值?

时间:2009-12-15 04:59:45

标签: msbuild registry msbuild-task

我正在创建一个MSBuild任务,它将读取特定注册表项的注册表。如果我在控制台应用程序中编写相同的代码行(见下文),它将返回预期的结果,但是当它在MSBuild任务中时,它不返回任何内容。

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

如果键/值对不存在,我希望上面的代码返回Nothing,如果它存在则返回值。当MSBuild任务执行时,我得到Nothing。是否有一些属性需要应用于MSBuild任务的Execute函数来告诉它需要读取注册表?

修改

以下是从MSBuild任务执行的内容:

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

我相信这是由我的Vista x64机器上的Registry Redirector在32位运行MSBuild引起的。是否有任何方法可以告诉自定义MSBuild任务(用VB .Net编写)查看HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\然后只有在没有任何内容的情况下才查看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\

谢谢,

Scott Blue

3 个答案:

答案 0 :(得分:13)

您可以直接从MSBuild读取注册表,而无需自定义任务,如下所示:

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

如,

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

你说你想从自定义任务中做到这一点,所以这可能不适用,但我发布它以防万一。

答案 1 :(得分:1)

我们的msbuild脚本从x86 Visual Studio命令提示符运行。使用此语法时,它不会读取64位注册表。它有一个不同的语法,允许x86读取64位注册表?

答案 2 :(得分:0)

如何使用VB的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()