MissingMethodException при доступе к классу переносимой библиотеки в Windows Phone 7

У меня есть проект, который имеет следующую структуру:

  1. Клиент WP7 (ссылки 2)
  2. Портативная библиотека (общая)
  3. Служба WCF (ссылки 2)

объявление 1) Клиент также содержит ссылку службы на службу (3) с типами, повторно используемыми из (2).
объявление 2) Библиотека содержит контракты данных (DataContract), используемые как службой, так и клиентами.

Все идет нормально. Все отлично работает на эмуляторе WVGA 512 Мб. Но когда я запускаю его на реальном устройстве или эмуляторе 7.1. Он бросает MissingMethodException где-то при построении класса (неизвестный класс).

Я смог сузить его (после нескольких часов комментариев) до контрактов в библиотеке (2). Всякий раз, когда код касается любого класса в переносимой библиотеке, возникает это исключение. Клиент (1) содержит ссылку (copy local == true). Не знаю, что еще я могу сделать.

Клиент — WP7.1, переносимая библиотека — .NET4+/SL4+/WP7+, а служба — .NET 4.5.

Почему это происходит, как использовать классы в переносимой библиотеке из WP7 на реальном устройстве (и/или эмуляторе 7.1).

Обновление: я переместил контракты данных в клиентский (1) проект. Но когда к ним обращаются, выдается то же самое исключение TargetInvocationException (с внутренним MissingMethodException). Я озадачен. Подозреваю теперь атрибут DataContract.

Обновление 2: это также не атрибут DataContract. Классы являются производными от абстрактного универсального класса. Я попробую пометить его атрибутом KnownType, если это поможет.

Обновление 3: это базовый класс. Я удалил его общий компонент, и он все еще не работает. Поэтому я полностью убрал базовый класс, и теперь он работает. Но почему это не работает? Это работает для сервиса, работает для эмулятора WVGA, почему не для устройства? Я пытался поставить KnownType в базовый класс, даже в подклассы. Ничего не работает.


person SmartK8    schedule 23.05.2014    source источник


Ответы (1)


Для тех, кто может получить это странное поведение. Это было вызвано показателями ковариации и контравариантности. У меня такая ситуация:

public IMyInterface<in TClass>
{
  void DoSomething(TClass value);
}

public MyClass : IMyInterface<MyClass>
{
  // not important
}

Это буквально вызвано входом (контравариантным) или выходом (ковариантом). Спасибо, Майкрософт. Когда я удалил их, внезапно не стало проблемы, когда приложение вообще не запускалось раньше.

person SmartK8    schedule 24.05.2014