我想使用通用Windows平台库中的数据类型,如何在PowerShell中引用包含的命名空间或程序集?
例如,我想用Windows.Data.Json.JsonObject
class来解析一些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文件实际上不是我应该寻找的。 p>
我认为UWP拥有它自己的酷GAC类商店,我可以从中加载共享库,我只是不知道如何。
基本上我的问题是,如何将UWP共享库加载到PowerShell中,我应该如何引用UWP类型的文字?
在Windows 10(build 1703)上运行PowerShell 5.1
答案 0 :(得分:8)
发布此问题后不久,我偶然发现the GitHub repo for BurntToast,这是一个允许从PowerShell提升UWP Toast Notifications的模块,它引用了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
仍然非常希望找到关于此的任何文档