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

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

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

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


person Steve Crane    schedule 21.01.2009    source источник


Ответы (6)


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

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

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

person Maurice    schedule 21.01.2009
comment
+1: именно это я и делаю с библиотекой, которая должна работать как на смарт-устройствах, так и на настольных компьютерах. Это называется возможностью перенацеливания (см. msdn.microsoft.com/en-us/magazine/cc163387). .aspx). - person ; 21.01.2009
comment
Похоже, это не так. Я создал быструю библиотеку Silverlight, чтобы проверить это, но при попытке сослаться на нее из проекта библиотеки Windows я получаю, что на проекты Silverlight могут ссылаться только другие проекты Silverlight. - person Steve Crane; 21.01.2009
comment
@Steve: Вы пытались просто ссылаться на dll, а не на весь проект? - person ; 21.01.2009
comment
@Андреас, да, теперь я вижу, что могу сделать двоичную ссылку на DLL, но не ссылку на проект. Так что это кажется хорошим решением. - person Steve Crane; 21.01.2009
comment
@Steve: я также только что установил ссылку на проект библиотеки классов Silverlight из обычного проекта библиотеки классов .NET, и это сработало отлично. Интересно, почему то же самое не сработало для вас. - person Maurice; 21.01.2009
comment
@Maurice: Это круто, я могу сослаться на проект Silverlight из проекта библиотеки Windows здесь, на работе. Я предполагаю, что у меня все еще есть версия Silverlight 2 RC0 на моем домашнем компьютере, которую я мало использую для разработки. Предположим, я должен обновить его. - person Steve Crane; 22.01.2009

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

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

person Andrew Barrett    schedule 13.07.2011

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

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

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

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

person Rinat Abdullin    schedule 21.01.2009

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

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

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

person Joel Martinez    schedule 21.01.2009

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

person Rajat Mehta    schedule 13.07.2010

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

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

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