5

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

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

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

编辑:

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

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

我相信这是由运行 32 位 MSBuild 的 Vista x64 机器上的注册表重定向器引起的。有没有什么方法可以告诉自定义 MSBuild 任务(用 VB .Net 编写)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\只在那里什么都不存在的情况下查看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\

谢谢,

斯科特蓝

4

3 回答 3

16

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

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

例如,

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

您说您希望通过自定义任务执行此操作,因此这可能不适用,但我将其发布以防万一。

于 2009-12-30T23:12:55.000 回答
2

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

于 2010-02-12T14:23:09.720 回答
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()
于 2009-12-16T10:31:41.870 回答