如何在Visual Studio 2017中将PCL转换为.net平台标准库?

16

我正在尝试将一个便携式的.NET类库转换成.NET平台标准库。在项目设置中有一个可点击的链接,看起来很对,它说“目标.NET平台标准”。

target .net platform

这个错误对我来说似乎很荒谬:

项目的目标无法更改。所选的目标需要该项目选择支持NuGet 3.0,但Visual Studio不能自动完成此操作。请卸载所有NuGet包并重试。

除了字面上删掉所有引用然后再尝试添加它们回来这种荒谬的方法外,是否有更合理的方法可以做到这一点?我不知道如何将这个我没有编写的项目转换为.NET标准,除非将所有引用都写在纸上,然后再尝试添加它们回来。这就是我被告知要做的吗?还有其他方法吗?我是不是做错了什么?

其次,即使我删除了所有可删除的引用,项目仍无法转换。我删除了Newtonsoft和所有其他可删除的引用,只剩下.NET、system和system.core,它们是不可删除的。

我仍然得到同样荒谬的错误。我试图修改的项目是一个在github上可用的开源项目,但我故意地尝试让这个问题更通用,以便对遇到这个“目标.NET平台标准根本不起作用”的问题的其他人有用。


1
你可以在Visual Studio for Mac中这样做,但不能在Visual Studio 2017中这样做。因此,工具尚未准备好。另一个临时限制是,虽然你应该能够手动编辑csproj文件(我还不知道如何在Windows上操作)。 - Lex Li
这个有更新了吗? - Jonathan
你在 RTM 版本中尝试过这个了吗,Jonathan? - Warren P
1
这在 RTM 中仍然存在。我不知道从这里该怎么做。项目的所有 nuget 包都已删除。我在 package.config 中验证了(实际上它还有一个引用,我必须将其删除)。也许这意味着从解决方案中删除(消息并不清楚),但那将是一个重大工作。 - Arian Kulp
我希望我能给这个更多的点赞。我遇到了同样的问题,无法相信没有其他解决方法。实际上,我已经记录下了我的项目中使用的参考文献,但最后还是去谷歌搜索了一次,因为我无法相信没有其他方法…… - K. Meke
显示剩余2条评论
3个回答

1

同样的问题

我也曾经为同样的问题苦苦挣扎:最好的解决方案是由@Jasper H Bojsen提供的。

所以我必须:

  • 根据我在pcl中使用的命名空间创建一个新项目
  • 重新安装Nuget包并下载引用
  • 然后编译,就没有错误了

0

我知道这可能不是你希望得到的答案,我也不能排除其他人找到了不同的成功途径。

无论如何。我有6-7 PCL's想要移动到.NET Standard。在尝试寻找自动化前进方式一段时间后,我最终采取了更加实用的方法。

我所做的是使用Visual Studio 2017(v15.2或更高版本)创建一个全新的.NET Standard项目。将PCL项目和新的.NET Standard项目并排打开(两个显示器会有所帮助),我基本上在新项目中重新创建了文件夹结构(使用Visual Studio),复制了文件(使用资源管理器),手动将文件添加到新项目中(使用Visual Studio),并手动包含和重新建立引用。

此外,请记住将程序集名称默认命名空间设置为与PCL 程序集名称默认命名空间相同。您可以通过右键单击项目并选择属性和应用程序选项卡来完成这些操作:

enter image description here

我知道这听起来像是枯燥的工作,但请相信我,它不需要很长时间,而且这个过程非常抗错误。当新项目编译完成时,你就完成了。如果没有完成,通常很容易找出缺失的内容。此外,当它可以运行时,你知道自己已经从一张干净的纸开始,并且没有拖累会在以后回来困扰你。

注意: 你可能会遇到在.NET Standard中缺少System.*库。如果发生这种情况,请尝试将其添加为NuGet。它们通常具有版本4.3.*。例如:System.Net.Security

你的PCL也可能依赖于与你所选择的.NET Standard版本或任何.NET Standard版本不兼容的库。在第一种情况下,请尝试看看是否可以使用更高版本的.NET Standard。在后一种情况下,你目前没有办法,但是请留意.NET Standard 2.0,它将具有更广泛的.NET API支持。


0

您可能需要手动修改项目文件。这需要一些工作,但以下是一些有用的提示。

在开始之前,如果源代码没有托管在其他地方,请备份您的源代码。

  • 首先,请确保项目文件使用与您即将创建的项目文件相同的文件格式。

  • 接下来,创建一个新的解决方案和项目,以针对您要查找的框架,并添加您正在使用的 NuGet 包。

  • 关闭新的解决方案并打开您要更改的项目,在加载后,卸载相关的项目。编辑项目文件,使用差异工具或手动打开您创建的新项目文件,并比较两个项目文件之间的更改。有几个关键部分需要特别注意。

  • 完成编辑项目文件后,请关闭它并重新加载项目。注意可能返回的任何错误,并根据需要进行更正。如果一切正常,请尝试编译。

这只是一种可能的解决方案,但从经验上看,项目文件存在许多小问题,因此不要将其视为最终解决方案。

以下是两种不同项目文件之间差异的示例,因此从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" />
        <!-- 自动包含对整个 .NET Framework 的引用 -->
      </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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接