Подтвердить что ты не робот

Как я могу использовать сборки без Silverlight в приложении Silverlight?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

Полный .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
{
}

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

С помощью условной компиляции (a-la good ol 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 описывает мультитаргетинг в мучительной детали.

Ответ 7

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

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

Ответ 8

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

http://buildassilverlight.codeplex.com/