Слово предупреждения, мой опыт на этом исходит от разработки для 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 описывает мульт таргетирования в мельчайших деталях.
Итак, мне лучше добавить фасад веб-сервиса на свой бизнес-уровень и использовать его для связи между приложением Silverlight и внутренним контентом? – norbertB
@norbertB да, это звучит неплохо. – JaredPar
Это совершенно верно, однако, если вы видите вторую ссылку в моем сообщении, кто-то придумал умный способ легко скомпилировать сборные .NET (настольные) сборки в Silverlight. Вы должны быть осторожны, какой код вы используете в сборке (и, возможно, используете условные операторы). – Noldorin