Почему MSCORLIB проверяет тип сообщений в классах PowerShell? - PullRequest
1 голос
/ 26 января 2020

Я наткнулся на очень странное поведение в PowerShell. Я по умолчанию загружаю сборку MSCORLIB в каждый сценарий PowerShell, который я пишу (я знаю, что он загружается по умолчанию, но все в порядке), и у меня до сих пор не было никаких проблем. Похоже, что если я загружаю MSCORLIB в класс, а затем использую объект этого класса в другом классе, PowerShell утверждает, что этот объект не является экземпляром самого себя, но когда я не загружаю сборку MSCORLIB, все работает должным образом. Чтобы лучше понять меня, нам понадобятся 3 файла, код которых следует:

CLASS.PS1:

USING ASSEMBLY MSCORLIB;
CLASS CLASS{}

CLASS2.PS1:

. .\CLASS.PS1;
CLASS CLASS2
{
    STATIC METHOD([CLASS]$PARAMETER){}
}

SCRIPT.PS1

. .\CLASS.PS1;
. .\CLASS2.PS1;
[CLASS2]::METHOD([CLASS]::NEW());
PAUSE

Итак, CLASS файл определяет CLASS. CLASS2 файл загружает CLASS и определяет другой класс, CLASS2. Он имеет METHOD, который принимает один PARAMETER и подтверждает, что он имеет тип CLASS. Я использую test SCRIPT, который загружает оба класса, а затем вызывает METHOD из CLASS2 и дает ему новый экземпляр CLASS.

, поскольку PARAMETER из METHOD действительно имеет тип CLASS и METHOD проверяет, что PARAMETER относится к типу CLASS, проверка должна пройти, и этот код не должен ничего делать (поскольку METHOD пусто). Однако этот код выдает следующую ошибку:

Cannot convert argument "PARAMETER", with value: "CLASS", for "METHOD" to type "CLASS": "Cannot convert the "CLASS" value of type "CLASS" to
type "CLASS"."
At C:\PLAYT\SOURCES\3.4\SYSTEM\SCRIPT.PS1:3 char:1
+ [CLASS2]::METHOD([CLASS]::NEW());
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Как видите, PowerShell пытается преобразовать CLASS в себя безо всякой причины. Это абсолютно нелогично, и я не могу найти никаких ошибок в этом коде.

Но самое удивительное, что, если я удаляю USING ASSEMBLY MSCORLIB; из CLASS файла, все работает, как ожидается, и проверка проходит успешно.

Я не вижу причины, по которой не загрузка MSCORLIB сборки в начале файла CLASS имеет значение. Этого не должно быть, поскольку сборка MSCORLIB по умолчанию загружается самой PowerShell задолго до того, как PowerShell даже открывает сценарий. Таким образом, MSCORLIB загружается независимо от того, загружаю я его явно в CLASS или нет. Еще кое-что. Загрузка MSCORLIB сборки в CLASS2 или в SCRIPT не генерирует ошибку. Ошибка генерируется, только если MSCORLIB загружено в CLASS.

Информация, которая может иметь отношение к воспроизведению проблемы: Версия PowerShell: 5.1.14393.2312. net Версия: 4.0.30319.42000 Windows Версия: 10.0.14393.2312 ОС: Windows Сервер 2016

Итак, почему это происходит? Что не так с этим кодом?

...