Dot-Net

如何在 PowerShell 中引用 UWP 類

  • July 13, 2017

我想使用通用 Windows 平台庫中的數據類型,如何在 PowerShell 中引用包含的命名空間或程序集?

例如,我想使用Windows.Data.Json.JsonObject該類來解析我的一些 json。

如果這是一個正常的 .NET 類,我會做類似的事情

Add-Type -AssemblyName Windows.Data.Json
$jsonObject = [Windows.Data.Json.JsonObject]::Parse('{data:["powershell","rocks"]}')

但是這個策略讓我失望了:

Add-Type : Cannot add type. The assembly 'Windows.Data.Json' could not be found.
At line:1 char:1
+ Add-Type -AssemblyName Windows.Data.Json
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   + CategoryInfo          : ObjectNotFound: (Windows.Data.Json:String) [Add-Type], Exception
   + FullyQualifiedErrorId : ASSEMBLY_NOT_FOUND,Microsoft.PowerShell.Commands.AddTypeCommand

現在,可能是我假設Windows.Data.Json命名空間的程序集是錯誤的Windows.Data.Json.dll,但 API 引用實際上似乎不包含對包含文件的任何引用,這讓我相信 dll 文件實際上不是我的應該尋找。

我假設 UWP 有它自己很酷的類似 GAC 的儲存,我可以從中載入共享庫,我只是不知道如何。

所以基本上我的問題是,如何將 UWP 共享庫載入到 PowerShell 中,我應該如何引用 UWP 類型文字?

在 Windows 10(內部版本 1703)上執行 PowerShell 5.1

發布此問題後不久,我偶然發現了 BurntToast 的 GitHub 儲存庫,這是一個允許從 PowerShell 引發 UWP Toast 通知的模組,它引用 WinRT ToastNotificationManager 類型,如下所示:

[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime]

所以,看起來我對 UWP 類的語法是:

[<class name>,<namespace>,ContentType = WindowsRuntime]

考慮到這一點,我用我在問題中給出的例子進行了嘗試,你瞧:

PS C:\> $jsonObjectClass = [Windows.Data.Json.JsonObject,Windows.Data.Json,ContentType=WindowsRuntime]
PS C:\> $jsonObject = $jsonObjectClass::Parse('{"data":["powershell","rocks"]}')
PS C:\> $jsonObject

Key  Value                 
---  -----                 
data ["powershell","rocks"]

在引用類型名稱一次之後,我似乎能夠在類型文字中使用類名稱而無需對其進行限定:

[Windows.Data.Json.JsonObject]::Parse("{}") # works without throwing errors now

儘管如此,仍然非常渴望找到有關此的任何文件

引用自:https://stackoverflow.com/questions/45086059