У меня есть код PowerShell, вызывающий [Newtonsoft.Json.Schema.SchemaExtensions]::IsValid
. Это работает в интерфейсе командной строки PowerShell (v5.1.18362.145
), но не в отладчике кода VS (v1.38.1
, расширение PS1 v2019.9.0
).
Фрагмент кода, который выдает:
$JsonDllPath = "$SetupScriptsDir\dependencies\Newtonsoft.Json.dll"
$JsonSchemaDllPath = "$SetupScriptsDir\dependencies\Newtonsoft.Json.Schema.dll"
Add-Type -Path $JsonDllPath
Add-Type -Path $JsonSchemaDllPath
$Errors = New-Object System.Collections.Generic.List[string]
$JsonObject = [Newtonsoft.Json.Linq.JToken]::Parse($JsonContent)
$SchemaObject = [Newtonsoft.Json.Schema.JSchema]::Parse($SchemaContent)
# THIS LINE THROWS
$result = [Newtonsoft.Json.Schema.SchemaExtensions]::IsValid($JsonObject, $SchemaObject, [ref] $Errors)
Я получаю сообщение об ошибке при переходе с отладчиком кода VS:
Cannot find an overload for "IsValid" and the argument count: "3".
At line:1 char:1
+ [Newtonsoft.Json.Schema.SchemaExtensions]::IsValid($JsonObject, $Sche ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
Мне кажется, существует проблема с печатанием, потому что:
В CLI:
> [Newtonsoft.Json.Schema.SchemaExtensions]::IsValid
OverloadDefinitions
-------------------
static bool IsValid(Newtonsoft.Json.Linq.JToken source, Newtonsoft.Json.Schema.JSchema schema)
static bool IsValid(Newtonsoft.Json.Linq.JToken source, Newtonsoft.Json.Schema.JSchema schema, [ref]
System.Collections.Generic.IList[string] errorMessages)
static bool IsValid(Newtonsoft.Json.Linq.JToken source, Newtonsoft.Json.Schema.JSchema schema, [ref]
System.Collections.Generic.IList[Newtonsoft.Json.Schema.ValidationError] errors)
InКод VS:
> [Newtonsoft.Json.Schema.SchemaExtensions]::IsValid
OverloadDefinitions
-------------------
static bool IsValid(Newtonsoft.Json.Linq.JToken, Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed source, Newtonsoft.Json.Schema.JSchema schema)
static bool IsValid(Newtonsoft.Json.Linq.JToken, Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed source, Newtonsoft.Json.Schema.JSchema schema, [ref] System.Collections.Generic.IList[string] errorMessages)
static bool IsValid(Newtonsoft.Json.Linq.JToken, Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed source, Newtonsoft.Json.Schema.JSchema schema, [ref] System.Collections.Generic.IList[Newtonsoft.Json.Schema.ValidationError] errors)
Обратите внимание, что код VS показывает дополнительную информацию для типа JToken. Возможно, это связано с тем, что VS Code загружает дополнительные сборки?
В CLI:
Show-LoadedAssemblies | Where-Object { $_.name -match "Json"}
name version PublicKeyToken location
---- ------- -------------- --------
Newtonsoft.Json 10.0.0.0 30ad4fe6b2a6aeed (...)\dependencies\Newtonsoft.Json.dll
Newtonsoft.Json.Schema 2.0.0.0 30ad4fe6b2a6aeed (...)\dependencies\Newtonsoft.Json.Schema.dll
В VS Code:
Show-LoadedAssemblies | Where-Object { $_.name -match "Json"}
name version PublicKeyToken location
---- ------- -------------- --------
Newtonsoft.Json 10.0.0.0 30ad4fe6b2a6aeed (...)\dependencies\Newtonsoft.Json.dll
Newtonsoft.Json 12.0.0.0 30ad4fe6b2a6aeed (...)\.vscode\extensions\ms-vscode.powershell-2019.9.0\modules\PSScriptAnalyzer\Newtonsoft.Json.dll
Newtonsoft.Json 11.0.0.0 30ad4fe6b2a6aeed (...)\.vscode\extensions\ms-vscode.powershell-2019.9.0\modules\PowerShellEditorServices\bin\Desktop\Newtonsoft.Json.dll
Newtonsoft.Json.Schema 2.0.0.0 30ad4fe6b2a6aeed (...)\dependencies\Newtonsoft.Json.Schema.dll
(Обратите внимание, что Show-LoadedAssemblies
- это моя функция, на основе этой статьи )
Редактировать 14 октября 2019 года:
Связанный вопрос: Код Powershell хорошо работает на Powershell. exe и Powershell ISE, но не работающие на VS Code
Связанные отчет об ошибках
И обходной путь