2017-07-19 83 views
0

我正在從.NET 4.0移植一個應用程序,以支持.NET 4.6和.NET Standard 1.6作爲跨平臺的MSBuild任務。netstandard1.6中的註冊表類; net46項目

此應用程序使用我們視爲Windows開發人員理所當然的各種東西。其中之一是RegistryRegistryKey類。這在.NET Standard 1.6中不再可用。

如何在任何Windows平臺(.NET Framework和.NET Core)上使用它並在其他平臺(僅限.NET Core)上忽略它?我有針對每個目標框架定義的編譯器符號,所以我可以將#if列出特定的代碼。但是目前這兩個類對於.NET標準目標是未知的,並且用紅色標出。

+0

你既定位了'net46'和'netstandard1.6'?如果是這樣,只需使用'#if NET46',你應該沒問題... –

+0

我可以這樣做,但在Windows上運行的'dotnet msbuild'需要註冊表查找。這是CLR或OS選擇,而不是構建目標選擇。 – ygoe

+0

那麼如果你想在編譯時,它*是一個構建目標選擇問題。定位netstandard時,您無法期望使用.NET Core中不可用的類。如果您在執行時檢測到您在Windows上並在完整框架中運行,則可以通過反射來加載相關程序集... –

回答

0

.NET標準1.6(顯然也2.0)不支持訪問Windows註冊表。因此,只有兩種選擇:

  1. 呼叫reg query使用相應的參數,並解析其輸出。這看起來像一個複雜的任務,所以我沒有對此進行調查。

  2. P /調用Windows API函數RegOpenKeyEx,RegCloseKeyRegQueryValueEx。這裏是我使用的代碼文件:https://gist.github.com/ygoe/bb776fac530176b08519a5314d53fcb6