Подтвердить что ты не робот

Могу ли я получить проект библиотеки классов "иногда переносимый" для загрузки в Visual Studio Express?

Для Noda Time версии 1.1, основная цель - создать вкус портативной библиотеки классов, в первую очередь для поддержки приложений Windows Phone и Windows Store. Это означает потерю некоторых функций, поэтому мы создаем конфигурацию рабочего стола и конфигурацию PCL (для каждого из отладки, выпуска и "подписанного выпуска" ).

Чтобы избежать необходимости работать с расширенными файлами проекта, все 6 конфигураций существуют в одном файле проекта. Файл проекта настроен для создания свойства "Переносимость" , которое настроено на "PCL" или "Desktop" , например:

<!-- Set the custom Portability property based on configuration -->
<PropertyGroup>
  <Portability Condition="'$(Configuration)' == 'Debug Portable'">PCL</Portability>
  <Portability Condition="'$(Configuration)' == 'Release Portable'">PCL</Portability>
  <Portability Condition="'$(Configuration)' == 'Signed Release Portable'">PCL</Portability>
  <!-- Default to desktop if not explicitly set above -->
  <Portability Condition="'$(Portability)' == ''">Desktop</Portability>
</PropertyGroup>

Затем у нас есть отдельные группы свойств для переносных vs desktop, основанные на вышеуказанном свойстве. Это то, что определяет тип проекта как "библиотека классов" или "портативная библиотека классов" (вместе с OutputType of Library, который является общим):

<!-- Desktop-specific properties -->
<PropertyGroup Condition="'$(Portability)' == 'Desktop'">
  <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  <TargetFrameworkProfile>Client</TargetFrameworkProfile>
</PropertyGroup>

<!-- PCL-specific properties -->
<PropertyGroup Condition="'$(Portability)' == 'PCL'">
  <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
  <ProjectGuid>{c78f6992-28d7-45c9-a4c1-6eaa649f3247}</ProjectGuid>
  <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  <TargetFrameworkProfile>Profile2</TargetFrameworkProfile>
  <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>

Это в целом работает очень хорошо - у меня разные конфигурации решений, поэтому я могу каждый раз создавать и тестировать все, и мне нужно только добавить каждый новый файл .cs в один файл проекта. Так что в Visual Studio 2012 Professional (это то, что я использую) я совершенно счастлив.

Проблема возникает, когда я пытаюсь загрузить решение в Visual Studio Express (VS2010 или VS2012). Несмотря на то, что решение загружается, он не может с ошибкой сказать, что некоторые проекты не могут быть загружены, а два проекта, которые создают версии PCL, имеют следующий вывод:

C:\Path\To\NodaTime.csproj : error  :
     The project file 'C:\Path\To\NodaTime.csproj' cannot be opened.

There is a missing project subtype.
     Subtype: '{786C830F-07A1-408B-BD7F-6EE04809D6DB}'
     is unsupported by this installation.

(Переформатировано для ясности.) Два проекта отказываются загружать, поэтому вы даже не можете просматривать исходный код.

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

Я попытался удалить конфигурации решений, которые относятся к конфигурациям проекта PCL, и это не помогает. Как ни странно, даже комментируя XML-элемент, например:

<!-- 
    <ProjectTypeGuids>(Guids as before)</ProjectTypeGuids>
 -->

не помогает - хотя удаление строки происходит. Как будто Visual Studio фактически не загружает его как настоящий XML файл. (Я не пробовал загружать версию с прокомментированным элементом в VS Pro.)

Я мог бы спуститься по пути создания отдельных файлов проекта PCL, если мне это нужно, но мне бы очень хотелось избежать этого, если это возможно - это сделало бы нормальное развитие более болезненным. Точно так же я мог бы генерировать только PCL и файлы решений Express-only, но опять-таки я бы предпочел - он просто чувствует себя не так.

В идеале я бы хотел поддержать VS Express как в 2010 году, так и в 2012 году, если есть решение, которое работает только в 2012 году, это будет хорошим началом.

Итак, есть ли способ убедить Visual Studio Express, что он действительно может загрузить проект, несмотря на группу условных свойств (условие которой не выполняется), ссылаясь на тип проекта, о котором он не знает?

4b9b3361

Ответ 1

Комментарий Дэвида Кина дал мне ответ, который я использую на данный момент:

или полностью удалить элемент <ProjectTypeGuid> - это позволит вам использовать "переносимые" усовершенствования, такие как пользовательский интерфейс для изменения целевой структуры и т.д.

Я пробовал это, и он работает как сон. На машинах, у которых все правильно установлено, вы можете даже построить версию PCL в Express! Я проверил, что результирующий двоичный файл действительно является PCL, и кажется, что это хорошо.

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

Ответ 2

Как ответили здесь:
Visual Studio 2012 Express с переносимой библиотекой классов?
и здесь:
Совместное использование функций с использованием переносимых классов классов

Проекты библиотеки портативных классов не поддерживаются в экспресс SKU... нужен более высокий SKU для полной поддержки. Конечно, двоичный (например, используя его как ссылку), просто не проект/источник поддержка.

Я могу себе представить, что есть простая причина для этого - существуют разные типы выпусков VS2012 Express: для разработки Windows Phone для приложений для настольных компьютеров для приложений под управлением Windows 8... Могу поспорить, что версия Windows Phone Express не знает о тип проекта Windows Phone и наоборот. Это может быть простой причиной того, что PCL не поддерживаются.

Хотя идея Portable Class Libraries действительно хороша, она по-прежнему весьма ограничена во многих отношениях, например, вы не можете использовать условную компиляцию с помощью #if xy, насколько мне известно. Если вам действительно нужно использовать Visual Studio Express для разработки, тогда было бы лучше использовать проекты для каждой платформы со ссылками на исходные файлы и условную компиляцию.