Обмен кодом С# между библиотеками классов Windows и Silverlight

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 6

У меня были некоторые проблемы с зависимостями при ссылке на библиотеку классов Silverlight в .NET.

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

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