Предупреждение: мой опыт в этой области связан с разработкой для 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 мультитаргетинг описан в мельчайших подробностях.