например.

а я вижу, чтоtypeof(Foo) возвращает ноль Почему это случилось?

Это в C #, .NET 3.5.

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

Есть идеи?

Обновление 1

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

Обновление 2

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

Обновление 3

Столкнулся с той же проблемой только сейчас. Вот трассировка стека: Код до этого момента буквально просто:

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

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

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

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

 Amy20 янв. 2011 г., 11:21
Интересно. Можете ли вы предоставить пример кода, который демонстрирует проблему?
 leppie20 янв. 2011 г., 11:46
Я, например, не могу представить, как это может произойти.
 BoltClock♦20 янв. 2011 г., 11:22
Означает ли «иногда» время от времени один и тот же вызов или в определенных местах, но не в других?
 Amy20 янв. 2011 г., 16:12
Это, возможно, вопрос для Эрика Липперта и компании.
 leppie20 янв. 2011 г., 11:48
Пожалуйста, покажите все утверждение, где это происходит. Я подозреваю, что вы упускаете важную информацию.

Ответы на вопрос(5)

журналы слияния.

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

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

 ferosekhanj01 февр. 2011 г., 06:38
@ Стив Я не имел в виду, что typeof вернет ноль. Но так как тип определяется во время компиляции, поведение должно оставаться таким же во время выполнения. Он не может вести себя по-разному в разное время. Насколько я знаю, typeof никогда не возвращал NULL.
 Steve Dunn20 янв. 2011 г., 12:38
Но я не вижу, как он может вернуть ноль. Я пытаюсь воспроизвести тестовое приложение, которое использует много памяти, так как я думаю, что это исключение загрузки типа, которое проглатывается.

typeof(T) вернет ноль, если тип был создан в памяти. ЧерезSystem.Reflection.Emit например.

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

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

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

Еще интереснее наблюдать, как это иногда случается, а иногда нет.

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

 Steve Dunn20 янв. 2011 г., 12:37
Разрешение - время компиляции, но загрузчик загружает модуль, содержащий IFoo, в начале метода.

Ваш ответ на вопрос