Как использовать сборки не Silverlight в приложении Silverlight? - PullRequest
12 голосов
/ 06 апреля 2009

Я работаю над проектом (чистое хобби «Повышение квалификации»), который имеет один унифицированный бэкэнд и несколько фронтэндов (ASP.NET MVC 1.0 / JQuery и Silverlight 2). Когда я пытаюсь добавить ссылку на свою сборку бизнес-уровня в проекте Silverlight 2 (VS2008); Он отклоняется, потому что это не сборка Silverlight.

Есть ли способ включить и ссылаться на сборку не Silverlight в приложении Silverlight?

Ответы [ 9 ]

12 голосов
/ 06 апреля 2009

нет там нет. Silverlight работает на совершенно другом CLR, который несовместим с обычным (настольным) CLR. Он имеет базовый другой набор API в BCL и, что наиболее важно, другой номер версии метаданных. Эти два фактора, помимо прочего, препятствуют выполнению сборок, скомпилированных для настольной CLR, по умолчанию на Silverlight CLR.

Все сборки должны быть скомпилированы специально для silverlight.

8 голосов
/ 07 апреля 2009

На самом деле, хотя это сложно и, вероятно, не очень хорошая идея, можно ссылаться на сборки CLR в проекте Silverlight . У Дэвида Бетца есть пример в его блоге: http://www.netfxharmonics.com/2008/12/Reusing-NET-Assemblies-in-Silverlight

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

Наконец, помните, что любые объекты CLR, которые вы добавите, увеличат размер вашей загрузки.

3 голосов
/ 06 апреля 2009

Нет. Исходный код csproj должен знать, что это проект Silverlight. Это может означать сохранение двух файлов проекта с одинаковыми исходными файлами «.cs». Здесь есть удобный трюк csproj - (скопировано из protobuf-net , где я делаю это для нескольких фреймворков):

<ItemGroup>
    <Compile Include="..\YourMainProject\**\*.cs" />
</ItemGroup>

Тогда вам нужно поддерживать только один проект; проект Silverlight получает все из дерева.

Обратите внимание, что Silverlight BCL строго ограничен, и не все функции будут доступны. Получить код, который компилируется как в обычном .NET, так и в Silverlight, может быть ... сложно.

Либо используйте прокси-классы в приложении Silverlight (т. Е. Через WCF и т. Д.). Не так богато, но просто сделать.

3 голосов
/ 06 апреля 2009

Короткий ответ - боюсь, нет. Среда выполнения Silverlight была разработана как подмножество .NET Framework, но они не являются напрямую совместимыми. (Я полагаю, что среды выполнения реализованы совершенно по-другому, поскольку Silverlight был разработан для кроссплатформенности.)

Хорошая новость заключается в том, что у вас есть целый ряд обходных путей. В этом блоге и в этой статье CodeProject подробно обсуждается проблема и предлагаются различные чистые решения. Надеюсь, это поможет ...

3 голосов
/ 06 апреля 2009

Нет, невозможно ссылаться на сборки, которые не собраны в среде выполнения Silverlight.

Я нашел способ создать новый проект для моих бизнес-сборок, а затем добавить в него все классы из исходной сборки. Ключевым моментом является то, что когда вы добавляете их, делайте это как существующий элемент, и при нажатии кнопки «Добавить» нажмите стрелку вниз и «Добавить как ссылку». Таким образом, у вас все еще есть только одна кодовая база, хотя вам, возможно, придется добавить несколько классов, таких как ApplicationException, чтобы компенсировать то, что отсутствует в среде выполнения Silverlight.

2 голосов
/ 30 апреля 2010

Предупреждение: мой опыт в этой области связан с разработкой для Windows Phone 7, поэтому он может несколько отличаться от обычного Silverlight 3.

JaredPar указал, что CLR Silverlight несовместим с обычным CLR. Это не на 100% правильно, так как сборки, скомпилированные, так как библиотеки Windows будут по-прежнему работать в silverlight , при условии, что они используют поддерживаемые API. Вы можете вручную изменить проект silverlight и добавить ссылку на обычную сборку .NET. Обратите внимание, что вы можете добавить только ссылку на скомпилированную сборку, но не проект.

Приложение silverlight будет скомпилировано и запущено, но как только оно попытается использовать класс, которого нет в Silverlight, вы получите ошибку во время выполнения.

Чтобы продемонстрировать разницу в API, взгляните на следующие снимки экрана. Как вы можете видеть, у двух сборок есть несколько общих API, но в Silverlight есть некоторые, которых не хватает. Как только ваша сборка пытается получить доступ к этим API, приложение выходит из строя!

Полная версия .NET 4.0 mscorlib (System.serialization пространство имен):

Полный .NET 4.0 mscorlib http://img188.imageshack.us/img188/2131/fullmscorlib.png

Silverlight 3 mscorlib (System.serialization пространство имен):

Silverlight 3 mscorlib http://img526.imageshack.us/img526/4254/sl3mscorlib.png

Недостатком компоновки полной сборки .NET является то, что вы не знаете до времени выполнения, какие API не поддерживаются. Учитывая, что потенциально некоторые поддерживаемые системные API могут использовать неподдерживаемый системный API, простого способа решить это заранее не существует.

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

Так что теперь, когда вы компилируете что-то, что ссылается на API, отсутствующий в Silverlight, вы получаете сообщение об ошибке:

public class SerializableExample: IEquatable<string>, System.Runtime.Serialization.ISerializable
{
}

ошибка CS0234: имя типа или пространства имен 'ISerializable' не существует в пространстве имен 'System.Runtime.Serialization' (вам не хватает ссылки на сборку?)

С помощью условной компиляции (а-ля добрый день C / C ++) вы можете отключить вещи, которые не поддерживаются:

public class SerializableExample: IEquatable<string>
#if !SILVERLIGHT
  , System.Runtime.Serialization.ISerializable
#endif
{
}

Microsoft также предоставляет инструмент компоновки проекта, который позволяет автоматически обслуживать проекты, имеющие связанные файлы. К сожалению, текущий выпуск не работает на VS2010, вы, вероятно, можете скомпилировать исходный код и сделать это, но я не пробовал.

http://msdn.microsoft.com/en-us/library/dd458870.aspx

Прямая ссылка для скачивания:

http://download.microsoft.com/download/6/3/8/6382E28D-2EBD-4A4E-BB76-6F425E1C9DB9/MicrosoftPracticesProjectLinkerFeb2009.msi

На этой странице Microsoft мультитаргетинг описан в мельчайших подробностях.

1 голос
/ 30 июня 2011

Поздно ответить, но добавление этой ссылки в на уровне сборки против повторного использования на уровне файла . Это очень тщательно.

1 голос
/ 14 июля 2010

Вы пробовали это? Он может создать сборку Silverlight, щелкнув правой кнопкой мыши проект библиотеки .NET.

http://buildassilverlight.codeplex.com/

1 голос
/ 06 апреля 2009

Среда выполнения Silverlight является подмножеством основного .Net CLR. Хотя это может показаться проблемой, для этого есть разумная причина - среда выполнения Silverlight должна быть достаточно легкой, чтобы быть плагином для браузера.

Если вы размещаете свои другие классы за веб-сервисами, они могут работать в полной среде .Net, в то время как ваше приложение Silverlight работает под урезанным CLR в плагине Browser.

...