2009-12-15 10 views
5

Tôi đang tạo một tác vụ MSBuild sẽ đọc sổ đăng ký cho một khóa đăng ký cụ thể. Nếu tôi viết cùng một dòng mã (xem bên dưới) trong một ứng dụng giao diện điều khiển, nó trả về kết quả mong đợi, nhưng khi nó nằm trong nhiệm vụ MSBuild, nó sẽ không trả về gì cả.Làm thế nào để bạn đọc một giá trị đăng ký bằng cách sử dụng một nhiệm vụ msbuild tùy chỉnh?

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

Tôi mong đợi mã trên trả về Nothing nếu cặp khóa/giá trị không tồn tại và trả về giá trị nếu nó tồn tại. Tôi nhận được Nothing khi tác vụ MSBuild được thực hiện. Có một số thuộc tính mà tôi cần phải áp dụng cho các Execute chức năng của nhiệm vụ MSBuild để nói với nó rằng nó cần phải đọc registry?

EDIT:

Dưới đây là những gì đã được thực hiện từ các nhiệm vụ MSBuild:

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

Tôi tin này được gây ra bởi sự Registry Redirector trên máy Vista x64 của tôi chạy MSBuild trong 32bit. Có cách nào mà bạn có thể nói với nhiệm vụ MSBuild tùy chỉnh (được viết bằng VB .Net) để xem trong HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\ sau đó chỉ khi không có gì tồn tại ở đó thì hãy xem trong HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\?

Cảm ơn bạn,

Scott xanh

+0

bạn đã thử một công cụ như RegMon để đảm bảo rằng bạn đang đọc đúng khóa đăng ký khi nó được nhấn từ MSBuild? Có thể là một số tiếng leng keng 32-bit/64-bit đang diễn ra? –

+0

Suy nghĩ tốt, tôi sẽ xem xét ... – Scott

+0

Vì vậy, 'RegMon' được thay thế bằng' Process Monitor' và nó báo cáo rằng khi tôi sử dụng ứng dụng giao diện điều khiển để đọc sổ đăng ký, nó đã được đọc thành công qua TestingRegistry. exe (Tên chương trình). Nhưng khi tôi chạy tác vụ, nó sử dụng chương trình devenv.exe làm ứng dụng gọi và thực sự đang cố gắng mở khóa này: 'HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup' và nhận lỗi' NAME NOT FOUND'. Tại sao nó sẽ thêm vào một phần tử 'Wow6432Node' vào đường dẫn? – Scott

Trả lời

0

Làm thế nào về việc sử dụng chức năng If() ternary VB không?

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 

Giả sử bạn có một tài sản Output():

Private _sqlPath As String 

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

Sau đó, tất cả các bạn phải làm là gọi nó từ Execute() phương pháp:

_sqlPath = GetSqlPathFromReg().ToString() 
+0

Suy nghĩ tốt, nhưng không hoạt động. Do Registry Redirector, 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSSQLServer \ Setup \' được chuyển thành 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \' một cách tự động, do đó giải pháp của bạn có hiệu quả là: 'Return If (Registry .GetValue ("HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \", "SQLPath", Không có gì), _ Registry.GetValue ("HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ MSSQLServer \ Setup \", "SQLPath", Không có gì)) ' Wow6432Node được tự động tiêm. – Scott

+0

Có thể bạn chỉ cần nhìn vào một vị trí khác, xem: http://support.microsoft.com/kb/936491 – KMoraz

12

Bạn có thể đọc registry trực tiếp từ MSBuild , không có tác vụ tùy chỉnh, như sau:

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

Ví dụ:

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

Bạn nói rằng bạn đang tìm cách để làm điều này từ một công việc tùy chỉnh, vì vậy điều này có thể không áp dụng, nhưng tôi đăng nó trong trường hợp nó giúp.

+0

nhưng nó được áp dụng cho tôi !!! cám ơn. –

1

Tập lệnh msbuild của chúng tôi chạy từ Dấu nhắc lệnh Visual Studio x86. Nó không đọc đăng ký 64 bit khi sử dụng cú pháp này. Nó có một cú pháp khác nhau mà sẽ cho phép x86 để đọc đăng ký 64 bit?