FileNotFoundException в переносимой библиотеке классов?

У меня есть 3 сборки: приложение WP7 (с ориентацией на 7.0), проект веб-служб (работает с 4.0) и переносимая библиотека классов (построенная из шаблона и ориентированная на WP7, SL4 и .NET 4.0), которая содержит общий тип, используемый между первые два.

При локальном запуске (в IIS Express) все работает нормально, однако при запуске против развернутого экземпляра сборки веб-служб (на удаленном сервере IIS, над которым у меня мало контроля) происходит сбой со следующим исключением:

System.IO.FileNotFoundException: не удалось загрузить файл или сборку «System.Xml.Serialization, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089» или одну из ее зависимостей. Система не может найти указанный файл. Имя файла: «System.Xml.Serialization, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089» ---> System.IO.FileNotFoundException: не удалось загрузить файл или сборку «System.Xml.Serialization, версия = 2.0». .5.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35, Retargetable = Yes» или одна из его зависимостей. Система не может найти указанный файл. Имя файла: «System.Xml.Serialization, версия = 2.0.5.0, культура = нейтральная, PublicKeyToken = 31bf3856ad364e35, Retargetable = Yes»

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

Если я удалю ссылку на сборку PCL, а затем добавлю файл класса ключа к обеим сборкам, все будет работать нормально, однако я хочу избежать такого дублирования кода... поэтому возникает вопрос: Почему это происходит? Как мне настроить PCL, чтобы он функционировал, как написано?

EDIT: немного больше информации... мой PCL использует XmlSerializer, что-то, что находится в System.Xml.dll на рабочем столе и в System.Xml.Serialization.xml в Silverlight... сборка, которая не существует в полной настольная среда... так что этот сбой имеет некоторый смысл, только в мире PCL некоторые из этих сборок/классов разбиты сами по себе

В этом случае XmlSerializer фактически находится в C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETPortable\v4.0\Profile\Profile2\System.Xml.Serialization.dll (который ссылается на PCL)... в качестве теста я добавил ту же ссылку в веб-проект... однако во время выполнения веб-проекта происходит сбой с желтым экраном смерти, в котором говорится, что:

Не удалось загрузить файл или сборку «System.Xml.Serialization» или одну из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)


person Brendan Grant    schedule 19.12.2011    source источник
comment
Убедились ли вы, что пул приложений, в котором работает ваша веб-служба на удаленном сервере, настроен на использование той же версии .NET, что и в вашей локальной среде?   -  person M.Babcock    schedule 19.12.2011
comment
Вы захотите отладить это, используя журнал Fusion. Viewer. Просто убедитесь, что вы запускаете его от имени администратора, включаете журнал и перезагружаетесь перед попыткой отладки. Вы увидите, где CLR ищет сборку и какую версию, и оттуда определите, почему она не найдена (если она у вас вообще установлена).   -  person    schedule 19.12.2011
comment
@ М.Бэбкок. И удаленный сервер, и локальный экземпляр IIS Express работают под 4.0.30319.239.   -  person Brendan Grant    schedule 20.12.2011
comment
@Воля. Поскольку удаленный сервер является общим веб-хостом, у меня нет доступа к такого рода журналам, а также доступа к реестру, чтобы настроить ключ, чтобы включить это.   -  person Brendan Grant    schedule 20.12.2011
comment
@BrendanGrant: Хм, похоже, на сервере не установлены нужные сборки.   -  person    schedule 20.12.2011
comment
@Will: кажется, это текущая теория, основанная на этом сообщении в блоге: mikaelkoskinen.net/post/ Однако мой веб-хост довольно медленно сообщает мне, установлен ли указанный патч (это не так) или когда он будет (они думают, к концу года).   -  person Brendan Grant    schedule 20.12.2011


Ответы (1)


Вам потребуется установить KB2468871 на удаленном сервере. Это GDR, который был отправлен на большинство клиентских машин, однако серверы должны будут согласиться на него (обычно они не устанавливают обновления автоматически).

person David Kean    schedule 19.02.2012