Совместное использование сборок между Silverlight и «простой ванилью» .Net - PullRequest
6 голосов
/ 20 марта 2009

Я использую некоторые универсальные классы в качестве контейнеров данных и использую их для передачи данных в службу wcf и из нее. Из-за способа, которым WCF переносит родовые имена на стороне клиента в класс с именем что-то вроде «ListOfBlah231546797646», я добавляю ссылку на реальную сборку как «KnownType».

Silverlight должен использовать эти сервисы, но может ссылаться только на «сборки Silverlight». Я переместил классы в их собственную «сборку silverlight» и могу ссылаться на них из silverlight, но при запуске службы я получаю сообщение об ошибке «Не удается найти ссылочную сборку» в сборке System.Runtime.Serialization.

Оказывается, Silverlight имеет свой собственный набор двоичных файлов, все они помечены как версия 2.0.5.0. Они не находятся в GAC службы, и поэтому выдается исключение.

Из-за этого я не могу ссылаться на мою "сборку Silverlight" из кода моей службы. Можно ли как-то обойти эту проблему, сделав две версии кросс-совместимыми, когда они будут сериализованы?

Этот вопрос похож, но ни один из ответов не помогает. Есть идеи? аналогичный вопрос

Ответы [ 3 ]

3 голосов
/ 23 марта 2009

Способ, которым я делюсь кодом между Silverlight и обычным CLR, заключается в использовании функции «добавить как ссылку» в проектах C #. В итоге все выглядит так:

| SilverlightLib
|   File1.cs
|   File2.cs
| ClrLib
|   File1.cs <as link>
|   File2.cs <as link>

Тогда VS работает нормально, и оба набора кода компилируются. Раздражающая часть, где платформа Silverlight не выстраивается. (В WCF есть некоторые части, которых нет в SL.) В этом случае вам нужно использовать препроцессор "#if SILVERLIGHT", чтобы код предназначался для обеих платформ.

До сих пор это работало довольно хорошо. Таким образом, я могу написать код, протестировать его с VSTS, но он все еще работает на SL из того же источника. Несколько советов:

  • Всегда редактируйте из проекта SL - таким образом, редактор ограничится SL, и в дальнейшем вы не получите сюрпризов.
  • Иногда вам нужно закрыть открытый файл, чтобы Intellisense мог обновить его в другом проекте.
1 голос
/ 20 марта 2009

В прошлом я делал это двумя способами.

Первый и самый простой. Добавьте службу WCF как ServiceReference в Silverlight. Это позаботится о восстановлении всех библиотек классов и обновлении их при необходимости.

Во-вторых, храните две копии классов, одну в серебряном свете и одну в .net 3.5 clr. Затем убедитесь, что имена и пространства данных DataContract совпадают. Если вы добавите ServiceReference в silverlight, то в проводнике просмотрите папку ServiceReference и посмотрите файл Reference.cs, вы увидите созданные классы и сможете их скопировать.

0 голосов
/ 21 марта 2009

Не уверен, возможно ли это в вашем сценарии, но задумывались ли вы о том, чтобы ваши объекты сериализовались как Json для вашего клиента Silverlight? Затем в приложении Silverlight вы можете использовать JsonObject в Silverlight. Таким образом, вы не будете использовать другой набор объектов модели в приложении silverlight.

JsonObject user = (JsonObject)JsonObject.Load(responseStream);
bool isMember = user["IsMember"];
string name = user["Name"];
int age = user["Age"];

Пример взят из этого образца MSDN

Приятной особенностью этого подхода также является то, что у вас есть поддержка linq в silverlight, и она также может использоваться вашими клиентами ajax. Это также более безопасно, чем показ ваших реальных объектов приложению silverlight, запущенному на клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...