Как устранить TypeLoadException, в котором не указан тип?

У меня есть приложение Windows Phone 7.1, которое ссылается на библиотеку Windows Phone 7.1. Эта библиотека ссылается на PCL, который включает в себя Windows Phone 7 или выше в качестве цели.

В какой-то момент приложение пытается создать новый экземпляр класса из библиотеки, которая расширяет класс из PCL. Класс PCL имеет защищенный конструктор, поэтому я переопределяю его в библиотечном классе, чтобы сделать его общедоступным. Конструктор принимает 1 параметр. В приложении я создаю экземпляр этого одного параметра и передаю его конструктору в библиотеке, у которого нет собственного кода, только : base() другому конструктору.

Я запускаю приложение в эмуляторе Windows Phone, и все идет нормально. Приложение загружается, и я просматриваю несколько экранов.

Я нажимаю точку останова и делаю шаг вперед. Я приземляюсь в конструкторе библиотеки нормально, но затем, когда я пытаюсь сделать еще один шаг, который будет в конструкторе PCL, я просто получаю исключение TypeLoadException, в котором говорится: «Произошла ошибка при загрузке типа». Трассировка стека останавливается на конструкторе библиотеки, и внутреннего исключения нет.

Я также пробовал эмулятор Windows Phone 7.8. И я также пытался создать новый экземпляр непосредственно в конструкторе класса библиотеки, используя конструктор без параметров и просто говоря : base(new ...), но все это терпит неудачу одинаково.

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

Мой гугл-фу иссякает. У кого-нибудь есть идеи, где я мог бы продолжить поиски?

Спасибо.


person Sloloem    schedule 21.11.2013    source источник


Ответы (1)


Я чертов идиот.

Итак, как было указано, была проблема с загрузкой чего-то из PCL, но это была такая эзотерическая ошибка, к которой .NET не был готов и просто срыгнул, ничего мне не сказав.

Чтобы устранить эту проблему, я закомментировал все тело конструктора, в результате которого были созданы экземпляры нескольких других классов из PCL и присвоены им переменные-члены. Это сработало.

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

Оказывается, корень моей проблемы в том, что, несмотря на то, что компиляция в Windows Phone 7 и Silverlight 4 прошла нормально, PCL использовал функции, которые Windows Phone 7 на самом деле не поддерживает. А именно, ко- и контравариантные универсальные интерфейсы. Мне пришлось реорганизовать мой PCL, чтобы он мог обрабатывать инвариантные универсальные типы, и все работало нормально.

person Sloloem    schedule 22.11.2013