InvalidCastException выдается после установки на новую машину - PullRequest
2 голосов
/ 25 июля 2011

Я использую Visual Studio 2010, C #.

Я работаю над этой программой уже почти год.В нем я использую информацию, хранящуюся в отдельных файлах XML, для создания изображений.Этот процесс работал для меня сотни раз без проблем.

Я мигрировал на новую машину.Предыдущая машина была 32-битной, новая - 64-битной.Когда я открываю файл и пытаюсь десериализовать, выдается следующее исключение:

System.InvalidCastException не обработано. Message = [A] System.Collections.Generic.List 1[BookCreator.pageFontInfo] cannot be cast to [B]System.Collections.Generic.List 1 [BookCreator.pageFontInfo].Тип A происходит от «mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089» в контексте «LoadNeither» в расположении «C: \ Windows \ Microsoft.Net \ assembly \ GAC_64 \ mscorlib \ v4.0_4.0.0»..0__b77a5c561934e089 \ mscorlib.dll.Тип B происходит от «mscorlib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089» в контексте «LoadNeither» в расположении «C: \ Windows \ Microsoft.Net \ assembly \ GAC_64 \ mscorlib \ v4.0_4.0.0»..0__b77a5c561934e089 \ mscorlib.dll '.

Вот код, который генерирует ошибку:

        List<pageFontInfo> info;
        XmlSerializer serializer = new XmlSerializer(typeof(List<pageFontInfo>));
        TextReader tr = new StreamReader(openFile);
        info = (List<pageFontInfo>)serializer.Deserialize(tr); <---error thrown

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

Редактировать: Я только что проверил.Я запустил скомпилированный .exe и исходный код на другом компьютере, который был 64-разрядным.То, что происходит сейчас, не имеет к этому никакого отношения.Это специфично для этой установки Visual Studio 2010.

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Нашли это! Я начал изучать мой код и обнаружил, что две идентичные сборки на самом деле были разными экземплярами. Я использовал программу в качестве библиотеки классов для веб-сайта. Таким образом, в рабочем каталоге был .dll проекта вместе с .exe, созданным при начале процесса отладки.

При загрузке программа загружала как .dll, так и .exe. Все, что мне нужно было сделать, это зайти в рабочий каталог и удалить их обоих. Тогда ошибка ушла.

0 голосов
/ 25 июля 2011

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

Возможно, я ошибаюсь, но попробуйте управляемый код в c #, вы получите Решение.

Всего наилучшего

...