Как изменить PCL в стандартную библиотеку платформы .NET в Visual Studio 2017?

Я пытаюсь понять, как изменить переносимую библиотеку классов .net в стандартную библиотеку платформы .net. В настройках проекта есть интерактивная ссылка, которая выглядит правильно: "Target.net platform standard".

target.net platform

Ошибка, которая кажется мне абсурдной:

Цели проекта не могут быть изменены. Для выбранных целей требуется проект по выбору поддержки NuGet 3.0, однако Visual Studio не может автоматически сделайте это за вас. Удалите все пакеты NuGet и повторите попытку.

Есть ли способ сделать это, который имеет больше смысла, чем абсурдный подход выше, буквально удаляя все мои ссылки, а затем пытающийся их добавить? Я не знаю, как взять этот проект, который я не писал, и преобразовать его в .net-стандарт, кроме как написать все ссылки на листе бумаги, а затем попытаться добавить их обратно. Это буквально то, что мне говорят делать? Есть ли другой способ? Я делаю это неправильно?

Во-вторых, даже когда я удаляю все ссылки, которые могут быть удалены, проект все равно не будет преобразован. Я удалил Newtonsoft и все другие ссылки, которые можно удалить, оставив только .net, system и system.core, которые не являются съемными.

Я все еще получаю ту же абсурдную ошибку. Проект, который я пытаюсь изменить, - это проект с открытым исходным кодом, доступный на github, но я намеренно пытаюсь сделать этот вопрос более общим, поэтому он может быть полезен другим, которые сталкиваются с этим стандартом платформы Target.net, не работает на всех "проблема.

Ответы

Ответ 1

То же самое здесь

Я много боролся с одной и той же проблемой: лучшим решением было решение, предоставленное @Jasper H Bojsen

Поэтому мне пришлось:

  • создать новый проект в отношении пространств имен, которые я использовал в pcl
  • ReNuggetManageDownloadPackagesReferences
  • и poof он скомпилировал, и у меня не было ошибки

Ответ 2

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

Прежде чем начать, создайте резервную копию своего источника, если он не размещен где-то еще.

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

  • Затем создайте новое решение и проект, который нацелен на структуру, которую вы ищете, и добавьте пакеты NuGet, которые вы используете.

  • Закройте новое решение и откройте тот, который вы хотите изменить, и после его загрузки выгрузите проект, о котором идет речь. Отредактируйте файл проекта и используя либо инструмент diff, либо вручную откройте свой новый файл проекта, который вы создали, и сравните изменения между двумя файлами проекта. Есть несколько ключевых разделов, на которые вы хотите обратить внимание.

  • Закончив редактирование файла проекта, закройте его и перезагрузите проект. Обратите внимание на любые ошибки, которые могут быть возвращены, и при необходимости исправьте. Если все работает правильно, попробуйте выполнить компиляцию.

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

Ниже приведен пример разницы между двумя различными файлами проекта, поэтому переход от PCL → Standard будет намного проще, чем наоборот. (Примечание. Это просто базовые проекты, которые я создал быстро, и, возможно, не представляю, что вы найдете.)

PCL

    <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
      <PropertyGroup>
        <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <ProjectGuid>{66c3d80b-6265-468a-82e1-b76317f9a9a5}</ProjectGuid>
        <OutputType>Library</OutputType>
        <RootNamespace>PCLTest</RootNamespace>
        <AssemblyName>PCLTest</AssemblyName>
        <DefaultLanguage>en-US</DefaultLanguage>
        <FileAlignment>512</FileAlignment>
        <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
        <TargetFrameworkProfile></TargetFrameworkProfile>
        <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <OutputPath>bin\Debug\</OutputPath>
        <DefineConstants>DEBUG;TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <DebugType>pdbonly</DebugType>
        <Optimize>true</Optimize>
        <OutputPath>bin\Release\</OutputPath>
        <DefineConstants>TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
      </PropertyGroup>
      <ItemGroup>
        <None Include="project.json" />
        <!-- A reference to the entire .NET Framework is automatically included -->
      </ItemGroup>
      <ItemGroup>
        <Compile Include="Class1.cs" />
        <Compile Include="Properties\AssemblyInfo.cs" />
      </ItemGroup>
      <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
    </Project>

Стандартный

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <TargetFramework>netstandard1.4</TargetFramework>
      </PropertyGroup>

    </Project>

Ответ 3

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

Так или иначе. У меня было 6-7 PCLs, которые я хотел переместить в .NET Standard. После долгой работы с ним, пытаясь найти автоматический путь вперед, я, наконец, приступил к гораздо более прагматичному подходу.

Что я сделал, так это создать новый проект .NET Standard с Visual Studio 2017 (v15.2 или новее). После того, как проект PCL и новый проект .NET Standard открылись бок о бок (здесь помогают два монитора), я в основном воссоздал структуру папок в новом проекте (используя Visual Studio), скопированную поверх файлов (используя Explorer), добавила файлы в новый проект вручную (с использованием Visual Studio), а также включил и восстановил ссылки вручную.

Кроме того, не забудьте установить Имя сборки и Место по умолчанию, чтобы оно было идентично PCL Имя сборки и По умолчанию пространство имен. Вы добираетесь до них, щелкнув правой кнопкой мыши по проекту и выбрав "Свойства" и вкладку "Приложение":

введите описание изображения здесь

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

Примечание: Вы можете столкнуться с недостатком системных. * Библиотек .NET. Если это произойдет, посмотрите, можете ли вы добавить это как NuGet. Обычно они имеют версию 4.3. *. Примером этого может быть System.Net.Security.

Также возможно, что вы используете PCL для библиотек, которые не совместимы с версией .NET Standard, которую вы выбрали, или любым стандартом .NET. В первом случае попробуйте и посмотрите, можете ли вы жить с более высокой версией .NET Standard. В последнем случае вам пока что не повезло, но обратите внимание на .NET Standard 2.0, который будет иметь гораздо более широкую поддержку .NET API.