2013-05-02 4 views
21

Мне было интересно, что фактически разрешает PCL? Если все, что он делает, ограничивает меня тем, какие типы являются кросс-платформенными, то почему Microsoft не сделала это как функцию в стандартной библиотеке .NET через среду IDE?Что фактически разрешает переносная библиотека классов?

В принципе, я могу легко скомпилировать библиотеку .NET, содержащую некоторые объекты POCO, и ссылаться на эту DLL в моем приложении Silverlight, WPF и Windows Store без необходимости перекомпилировать или иметь какие-либо проблемы. Есть ли какие-либо жесткие примеры кода, который работает в PCL, который не будет работать в стандартной библиотеке .NET?


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

ли есть ли какой-нибудь код, который будет компилироваться в Portable Class Library, который не будет функционировать, если этот точно такой же код был в библиотеке .NET?

+1

Он позволяет поддерживать несколько версий .NET Framework без создания нескольких версий проекта. В противном случае вам понадобится отдельный prject для таргетинга WPF и Windows Store. –

+0

@Ramhound: Я понимаю, каковы его цели, но я надеялся на реальный пример кода, который бы корректно функционировал только в PCL (скомпилированном один раз) по сравнению с стандартной библиотекой .NET (скомпилированной один раз). Не могу ли я использовать стандартную библиотеку .NET, если бы я заставил себя использовать только классы и методы, которые были кросс-платформенными? Прочтите вопрос, я спрашиваю, будет ли ** точный точный код **, который работает в PCL, неправильно функционирует в библиотеке .NET. – michael

+0

Ваша идея использования только классов, существующих в нескольких версиях .NET Framework, - это именно то, что делает портативная библиотека классов. Код .NET - это код .NET. –

ответ

21

две вещи:

Во-первых, если ваше намерение состоит в том, чтобы создать библиотеку, которая делает работу на нескольких платформах, вы не хотите, чтобы выяснить, что во время выполнения вы случайно использовали API, который не был доступен на всех платформах (через исключение TypeLoadException или MissingMethodException или что-то еще). Таким образом, переносные библиотеки классов предоставят вам intellisense для API, которые поддерживаются на всех платформах, на которые настроены таргетинг, и вы получите ошибки сборки для чего-либо вне этого набора.

Во-вторых, при создании .NET Framework библиотеку, которая использует только API-интерфейсы, которые доступны на всех платформах DLL создается еще не будет работы на других платформах (например, Windows Phone и Silverlight) без компиляции в виде библиотеки для этих платформ. Похоже, вы ожидаете, что это произойдет, и это разумное ожидание, но в прошлом это было не так. Портальные библиотеки классов - это то, как мы делаем эту работу (и на самом деле это так, если вы создаете библиотеку классов для приложений Windows Store и используете только API-интерфейсы, доступные для .NET Framework и WP8, результирующий двоичный файл будет работать на обеих этих платформах без изменений).

+2

Я предполагаю, что OP пытался увидеть, есть ли больше для PCL, чем просто ограничение intellisense, которое есть ... :) –

+2

Ну, это могут быть некоторые цели PCL, но они определенно еще не там , Оба .Net Framework и Silverlight/WP7 имеют классы «Socket», «IPEndPoint» и т. Д. Тем не менее, у PCL их нет. Оба .Net Framework + XNA, Silverlight5 и WP7 имеют классы «Vector3», «Matrix» и т. Д., Но у PCL их нет. В дополнение к нескольким несовместимым фреймворкам теперь у нас есть еще 30 несовместимых профилей. И мне все еще интересно, что было настолько не переносным в моей функции, что добавляет два целых числа, которые я должен использовать PCL, чтобы сделать его переносимым ... –

+0

@ Ark-kun См. Http://blogs.msdn.com/b/dsplaisted /archive/2012/08/27/how-to-make-portable-class-libraries-work-for-you.aspx по некоторым распространенным причинам, почему API-интерфейсы не переносимы. В целом, Silverlight и WP7 не были разработаны специально для PCL. Из .NET 4.5, .NET для приложений Windows Store и Windows Phone 8 вы обнаружите, что почти все API-интерфейсы, доступные на нескольких платформах, переносятся на всех платформах. –

1

Существует несколько отличий API в библиотеке портативных классов, которые относятся к .NET Framework 4, когда вы работаете в Visual Studio 2012. В первую очередь это касается нескольких свойств и методов в пространствах имен и System.Xml. Для получения подробной информации см. Страницу this MSDN.

2

Что фактически разрешает переносная библиотека классов?

В конце концов он решит LOT! (Как и Java, но в этом столетии)

Есть ли код, который компилируется в портативных библиотеках классов, что не будет функционировать должным образом, если что точно такой же код был в .NET библиотека?

По принципу Я думаю, что нет, не наоборот?

Но я думаю, будет всем уважении, вы могли бы быть фактически отсутствует точка

Подумайте о том, копировать/код вставки, и клонирование проекта, связывая код, условных директив компилятора, (даже шаблоны T4?) И конечным результатом является ссылка DLL Hell и ненужная сложность, шаблон, многословие (не очень элегантно?)

Не обходные пути к двоичной несовместимости?

Его очень рано Но я думаю, что это удивительное направление, в основном, когда вы видите, что Xamarin и Mono работают в поддержке pcl (они уже частично работают), я думаю, что это единственное, что он мог бы сэкономить, поскольку все это из-за Html и Javascript frenzy или генераторы кода. (Долго жить типизированного!)

PCL может также освободить C# армию из ящиков Windows,

(но все это только мое мнение)

5

Я бы не слишком беспокоиться о самом коде , но просто попробуйте следующее и посмотрите, почему Portable Class Libraries полезны.

  1. Создать стандартный .NET 4.5 Class Library (он может быть пустым/не содержать классов).
  2. Создайте приложение Silverlight 5.
  3. Попытайтесь ссылаться на библиотеку классов .NET 4.5 из приложения Silverlight 5.

Вы получите следующее сообщение об ошибке:

Вы не можете добавить ссылку на Demo.Utils.dll, поскольку он не был построен против Silverlight выполнения. Проекты Silverlight будут работать только с с помощью сборок Silverlight.

Это само по себе, это просто вкус, чтобы почему библиотеки Portable Class настолько замечательны. Жесткая часть пытается адаптировать код к агностике платформы, что звучит просто, но не так просто, как вы думаете. Поверьте мне, когда вы сначала попытаетесь прочитать файл из папки и поймете, что PCL не разрешает FileInfo, вы будете разочарованы, но руководство от Microsoft - отвлечь от зависимостей платформы и внедрить класс, который реализует интерфейс что на самом деле позаботится об этом. На самом деле, здесь есть nice article.


Еще одна полезная статья, которую нужно пересмотреть, - это часть внутренней работы способа создания PCL. Эта статья поможет вам понять, почему почему PCL могут ориентироваться на несколько платформ. https://www.simple-talk.com/blogs/2013/04/19/inside-portable-class-libraries/

+1

«Это само по себе - это просто вкус, почему портативные классные библиотеки настолько замечательны». Я бы сказал, что PCL пытаются решить проблему, которая никогда не была там, но этого не сделать. –

+0

«Я бы сказал, что PCL пытаются решить проблему, которая никогда не была там» - Как бы проблема не была? Очевидно, что нецелесообразно иметь одинаковые API-интерфейсы на разных платформах. Внедрение полнофункциональной платформы API API-интерфейсов является огромным начинанием, и было бы лучше иметь .NET-поддержку только одной платформы. Это та же самая причина, почему приложение поддерживает только собственное оборудование, потому что они имеют контроль над всеми аспектами и могут позволить разработчикам использовать всю мощь языка и API. – Anshul

3

Я создал простой Youtube видео на Что такое библиотека портативного класса, вы можете увидеть его здесь http://www.youtube.com/watch?v=DcBfjdDHlxo

Но позвольте мне ответить более подробно here.The весь смысл создания проекта библиотеки классов является возможностью многократного использования. Теперь мы хотим, чтобы это повторное использование не только в .NET-приложении, но не в .NET-приложениях, а через различных типов приложений .NET. Теперь различные типы приложений .NET - это WPF, Windows, Silver light, Windows phone и т. Д. enter image description here

Теперь у каждого из этих типов приложений разные версии .NET.

Например, если вы попробовали ссылаться на простой проект класса, вы закончите с ошибкой ниже. Вот где полезные библиотеки классов. Создавая переносимый класс, мы можем ссылаться на него в любых типах проектов .NET.

 Смежные вопросы

  • Нет связанных вопросов^_^