Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Visual Studio 2017中将PCL更改为.net平台标准库?_C#_Visual Studio 2017_.net Standard - Fatal编程技术网

C# 如何在Visual Studio 2017中将PCL更改为.net平台标准库?

C# 如何在Visual Studio 2017中将PCL更改为.net平台标准库?,c#,visual-studio-2017,.net-standard,C#,Visual Studio 2017,.net Standard,我正在试图找出如何将一个可移植的.net类库更改为.net平台标准库。在项目设置中有一个可点击的链接,看起来不错,上面写着“目标.net平台标准” 我认为荒谬的错误是: 项目的目标无法更改。选定的目标需要 然而,VisualStudio无法让project选择NuGet 3.0支持 自动为您执行此操作。请卸载所有NuGet软件包和 再试一次 有没有什么方法比上面那种荒谬的方法更有意义,那就是删除我所有的参考资料,然后再把它们加回去?我不知道如何把这个我没有写的项目转换成.net标准,除了把所有

我正在试图找出如何将一个可移植的.net类库更改为.net平台标准库。在项目设置中有一个可点击的链接,看起来不错,上面写着“目标.net平台标准”

我认为荒谬的错误是:

项目的目标无法更改。选定的目标需要 然而,VisualStudio无法让project选择NuGet 3.0支持 自动为您执行此操作。请卸载所有NuGet软件包和 再试一次

有没有什么方法比上面那种荒谬的方法更有意义,那就是删除我所有的参考资料,然后再把它们加回去?我不知道如何把这个我没有写的项目转换成.net标准,除了把所有的引用写在一张纸上,然后再把它们加回来。这就是我被要求做的吗?还有别的办法吗?我做错了吗

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


我仍然会犯同样荒谬的错误。我试图修改的项目是github上提供的一个开源项目,但我有意让这个问题更一般,以便对遇到“Target.net平台标准根本不起作用”问题的其他人有用。

您可能需要手动修改项目文件。这需要一些工作,但这里有一些东西可以帮助你

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

  • 首先,确保项目使用与下一步创建的项目文件相同的文件格式

  • 接下来,创建一个新的解决方案和项目,该解决方案和项目针对您正在寻找的框架,并添加您正在使用的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> 14 调试 任意CPU {66c3d80b-6265-468a-82e1-b76317f9a9a5} 图书馆 PCLTest PCLTest 恩美 512 {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} v5.0 真的 满的 假的 bin\Debug\ 调试;痕迹 促使 4. pdbonly 真的 bin\Release\ 痕迹 促使 4. 标准

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard1.4</TargetFramework> </PropertyGroup> </Project> netstandard1.4
我知道这可能不是你希望得到的答案,我不能排除其他人找到了不同的成功途径

无论如何。我有一个想法,我想转到.NET标准。在摆弄它一段时间,试图找到一条自动前进的道路后,我终于找到了一个更务实的方法

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

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

我知道这听起来很无聊,但相信我,这不会花很长时间,而且这个过程对错误的抵抗力非常强。当新项目编译完成时,您就完成了。如果没有,通常很容易找出遗漏了什么。而且,当它起作用的时候,你知道你已经从一块干净的石板上开始了,你不会拖累以后会回来困扰你的东西

注意: 您可能会遇到.NET标准中缺少的System.*库。如果发生这种情况,看看你是否可以添加一个NuGet's。它们的版本通常为4.3.*。这方面的一个例子是System.Net.Security

您的PCL还可能依赖于与您决定的.NET标准版本或任何.NET标准不兼容的库。在第一种情况下,尝试看看是否可以使用更高版本的.NET标准。在后一种情况下,您目前运气不佳,但请注意.NET标准2.0,它将具有更广泛的.NET API支持

这里也一样 我为同一个问题奋斗了很多:有效的解决方案