2009-04-06 3 views
12

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

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

ответ

12

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

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

+0

Итак, мне лучше добавить фасад веб-сервиса на свой бизнес-уровень и использовать его для связи между приложением Silverlight и внутренним контентом? – norbertB

+0

@norbertB да, это звучит неплохо. – JaredPar

+0

Это совершенно верно, однако, если вы видите вторую ссылку в моем сообщении, кто-то придумал умный способ легко скомпилировать сборные .NET (настольные) сборки в Silverlight. Вы должны быть осторожны, какой код вы используете в сборке (и, возможно, используете условные операторы). – Noldorin

3

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

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

+0

Существует также инструмент компоновщика проекта, доступный из кода, который позволяет автоматически синхронизировать два проекта. Это идеальное решение для бизнес-объектов. Не забудьте пойти SL -> .NET хотя, или вы рискуете оказаться с элементами, которые не могут быть снова созданы :-) –

3

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

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

3

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

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

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

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

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

1

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

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

8

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

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

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

2

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

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

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

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

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

Full .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: The type or namespace name 'ISerializable' does not exist in the namespace 'System.Runtime.Serialization' (are you missing an assembly reference?)

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

1

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

http://buildassilverlight.codeplex.com/