Совместное использование кода 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 (создает несколько проектов). Но это выглядит грязно.
Существует аналогичная проблема с проектами 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.