Подтвердить что ты не робот

Почему typeof (Foo) когда-либо возвратит null?

Иногда я вижу, что typeof(Foo) возвращает null. Почему это произойдет?

Это в С#,.NET 3.5.

Я думал, что это может иметь какое-то отношение к сборке, содержащей тип, который еще не загружен, но тестовое приложение показывает, что сборка загружается в начале метода, где используется typeof.

Любые идеи?


Обновление 1

  • Я не могу предоставить воспроизводимый образец, как это происходит в огромном приложении
  • Когда я говорю "иногда", я имею в виду тот же метод в моем приложении, но в разных случаях. Кроме того, когда он не работает один раз при запуске, он будет терпеть неудачу каждый раз для этого экземпляра приложения.

Обновление 2

В рассматриваемом приложении используется huuuuuge объем памяти и работает на 32-битной XP. Я думаю, возможно, это TypeLoadException или OutOfMemoryException, которые каким-то образом проглатываются (но я не вижу, как, как я пробовал это, с исключениями первого шанса, включенными в отладчике).


Обновление 3

В этот же самый вопрос только сейчас. Здесь трассировка стека: enter image description here Код до этого момента буквально справедлив:

Type tradeType = typeof(MyTradeType)
TradeFactory.CreateTrade(tradeType)

(раньше это было ..CreateTrade(typeof(MyTradeType)), поэтому я не мог сказать, вернул ли typeof null)

Итак, похоже, что typeof() не возвращает null, но получает значение null до того момента, пока оно закончится в CreateTrade.

Исключение (NullReferenceException) имеет свойство HResult 0x80004003 (Invalid pointer). Вызов System.Runtime.InteropServices.Marshal.GetLastWin32Error( ) (в окне Immediate) возвращает 127 (The specified procedure could not be found). Я просмотрел окно "Модули", и модуль, который содержит этот тип и метод, был загружен и не выглядит ошибкой загрузчика.


4b9b3361

Ответ 1

По какой-то причине загрузилась dll? Вы проверили журналы fusion logs.

Я бы предположил, что это вызовет больше проблем, чем просто это, но если вы делаете эту проверку перед тем, как использовать что-либо из сборки, это может скрыть дальнейшие проблемы.

Ответ 2

Так как typeof(T) - это оператор времени компиляции, время загрузки сборки не будет задействовано.

Было бы интересно увидеть какой-то код, демонстрирующий это.

Еще интереснее видеть, как это происходит иногда, а иногда и нет.

Первый ответ может быть: использовать GetType() в экземпляре.

Ответ 3

typeof определяет тип во время компиляции. Поэтому, даже если он возвращает null, он должен всегда возвращать значение null. Поскольку поведение не изменяется во время выполнения. Дайте некоторый фрагмент кода, некоторые другие вещи сломаны.

Ответ 4

Это вполне возможно и очень легко воспроизвести. typeof(T) возвращает значение null, если тип был создан в памяти. Например, через System.Reflection.Emit.

Ответ 5

У меня возникла эта проблема в моем проекте VSPackage при использовании typeof (MyClass) в конструкторе пакета. Я переместил свой код на переопределенный метод Initialize(), а затем он работал нормально, поэтому похоже, что сборка, которая не загружается, может быть фактором этой ошибки несколько раз. Я также отмечу, что мой VSPackage загружается во время выполнения в Visual Studio с помощью MEF, поэтому это скорее не типичный сценарий, а все-таки подумал, что я упоминал об этом.