Совместное использование кода C# между библиотеками классов Windows и Silverlight

Мы написали небольшую библиотеку классов Windows, которая реализует методы расширения для некоторых стандартных типов (изначально строк). Я поместил это в библиотеку, чтобы любой из наших проектов мог использовать его, просто ссылаясь на него и добавляя с помощью XXX.Extensions.

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

Это не идеально, и я подумал, что у кого-нибудь могут быть идеи для лучшего способа обмена методами расширения и другим вспомогательным кодом между проектами Windows и Silverlight.

6 ответов

Решение

Вы не можете установить ссылку из сборки Silverlight на обычную сборку.NET, но вы можете сделать это наоборот.

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

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

Поскольку на этот вопрос дан ответ, существует новое решение от Microsoft, Portable Class Libraries. Вот сообщение в блоге, где они объявили об этом.

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

Время выполнения Silverlight отличается от обычного времени выполнения.NET. Так что вам нужно делать трюки на уровне проекта, чтобы делиться кодом между несколькими платформами.

Вот как я это сделал для контейнера Autofac IoC.

При таком подходе вам не нужно создавать разные проекты для каждой целевой платформы.

PS: есть также инструмент Project Linker из Composite WPF, который позволяет связывать проекты Silverlight и WPF (создает несколько проектов). Но это выглядит грязно.

Попробуйте это http://buildassilverlight.codeplex.com/

Существует аналогичная проблема с проектами XNA. Поскольку вы можете ориентироваться на несколько разных платформ, вам необходимо иметь разные проекты. Причина этого в том, что библиотеки базовых классов, на которые ссылается проект, зависят от платформы, поэтому у вас не может быть только одного проекта.

Если вам интересно, вы можете получить немного понимания из этого блога:

Чтобы перекомпилировать исходный код для другой платформы, вам нужен другой проект. Причина этого заключается в том, что проекты должны ссылаться на разные сборки как для XNA Framework, так и для лежащего в основе.NET Framework (Xbox 360 и Zune используют.NET Compact Framework), а проекты C# не предоставляют поддержку ссылок на разные сборки для разные платформы.

У меня были некоторые проблемы с зависимостями при обращении к библиотеке классов Silveright в.Net.

Альтернативный способ при использовании Visual Studio 2010 и WCF RIA 1.0:

  • Создайте нормальную сборку библиотеки.Net.
  • Создайте библиотеку классов Silverlight. В конфигурации сборки укажите первую библиотеку.NET в качестве "ссылки службы WCF RIA".
  • Поместите свой код в библиотеку.NET в виде файлов "ClassName.shared.cs".
  • WCF RIA будет обрабатывать копирование файла в сборку Silverlight.
Другие вопросы по тегам