- csharp/
- C# 如何在Visual Studio 2017中将PCL更改为.net平台标准库?
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支持 这里也一样
我为同一个问题奋斗了很多:有效的解决方案