(новый объект [xxx]). GetType () и typeof (Object []) возвращают различные типы после загрузки CustomMarshalers.dll в память - PullRequest
0 голосов
/ 10 ноября 2011

(новый объект [xxx]). GetType () начинает возвращать объект другого типа после загрузки CustomMarshalers.dll в память.

Возвращает объект Type, который ссылается на ту же запись метаданных в mscorlib.dll, но имеет поле Type.Guid, заполненное значением {9fa4230f-db51-34dd-b578-9c072c062046}.

Это нарушает любой код, который проверяет тип переменной, используя следующий синтаксис «variable.GetType () == typeof (object [])». В результате он разбивает двоичный десериализатор внутри mscorlib.dll. Это, в свою очередь, нарушает проверку лицензии в WinForms. Это в свою очередь нарушает все приложение.

Справка:

У меня есть неуправляемое настольное приложение, которое загружает и выполняет набор объектов .NET, которые реализуют предопределенный интерфейс COM. Приложение запускается как обычная неуправляемая программа. Затем он обнаруживает список COM-объектов, которые ему необходимо загрузить, загружает их и выполняет предопределенный контракт. Некоторые из этих COM-объектов реализованы в .NET.

.NET-код работает нормально, пока CustomMarshalers.dll не будет загружен в память. .NET код начинает сбой во всех местах после загрузки CustomMarshalers.dll в память.

CustomMarshalers.dll загружается, потому что приложение выполняет сценарий VB6 с использованием vbscript.dll (это отдельное действие из тех модулей, которые загружаются во время запуска). Сценарий использует COM-объект на основе .NET, который возвращает некоторое значение сценарию. Я думаю, что .NET загружает CustomMarshalers.dll в память, чтобы упорядочить эти значения.

Дополнительная информация:

Свойства AssemblyQualifiedName, ContainsGenericParameters, FullName, Namespace, генерируют исключение NullReference, если любое из них вызывается для объекта Type, полученного с использованием (новый объект [xxx]). GetType (). Все остальное, кроме свойства Guid, одинаково для обоих объектов Type.

...