[英]How can I change a PCL into a .net Platform Standard Library in Visual Studio 2017?
我試圖弄清楚如何將可移植的.net類庫更改為.net平台標准庫。 在項目設置中有一個可單擊的鏈接,看起來很正確,顯示為“ Target .net平台標准”。
在我看來荒謬的錯誤是:
項目的目標無法更改。 選定的目標要求項目選擇加入NuGet 3.0支持,但是Visual Studio無法自動為您執行此操作。 請卸載所有NuGet軟件包,然后重試。
有什么方法可以比上述荒謬的方法更有意義,即從字面上刪除我的所有引用,然后嘗試重新添加它們? 除了將所有引用寫在紙上然后嘗試再次添加它們之外,我不知道該如何接受我沒有編寫的項目並將其轉換為.net標准。 這真的是被告知我要做的嗎? 還有另一種方法嗎? 我做錯了嗎?
其次,即使我刪除了所有可以刪除的引用,該項目仍然無法轉換。 我刪除了Newtonsoft和所有其他可以刪除的引用,只留下了不可移動的.net,system和system.core。
我仍然得到同樣荒謬的錯誤。 我要修改的項目是github上可用的開放源代碼項目,但是我有意使這個問題更籠統,因此對遇到此“ Target .net平台標准不起作用的其他人可能有用”完全沒有”的問題。
我為一個完全相同的問題付出了很多努力:最有效的解決方案是@Jasper H Bojsen提供的解決方案
所以我必須:
您可能需要手動修改項目文件。 這需要一些工作,但是有些事情會有所幫助。
在開始之前,如果源未托管在其他地方,請對其進行備份。
首先,請確保該項目使用的項目文件格式與下一步中要創建的文件格式相同。
接下來,創建一個針對您正在尋找的框架的新解決方案和項目,並添加您正在使用的NuGet軟件包。
關閉新解決方案,然后打開要更改的解決方案,然后在加載后,卸載有問題的項目。 編輯項目文件,然后使用差異工具或手動打開您創建的新項目文件,並比較兩個項目文件之間的更改。 您需要注意幾個關鍵部分。
完成項目文件的編輯后,將其關閉並重新加載項目。 注意可能返回的任何錯誤,並根據需要進行糾正。 如果一切正常,請嘗試編譯。
這只是一種可能的解決方案,但是從經驗來看,項目文件有很多小問題,所以請不要將其作為最終解決方案。
下面是兩個不同項目文件之間差異的示例,因此從PCL-> Standard遷移比反向遷移要容易得多。 (注意:這些只是我快速創建的基本項目,可能並不代表您找到的內容。)
聚氯乙烯
<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>
我知道這可能不是您希望得到的答案,並且我不能排除其他人找到了成功的不同途徑。
無論如何。 我有6-7個PCL ,我想轉到.NET Standard。 在嘗試了一段時間之后,我嘗試了一下自動方法,最終我找到了一種更加實用的方法。
我要做的是使用Visual Studio 2017(v15.2或更高版本)創建一個全新的.NET Standard項目。 並排打開PCL項目和新的.NET Standard項目(這里有兩個監視器幫助),我基本上是在新項目(使用Visual Studio)中重新創建了復制到文件(使用資源管理器)的文件夾結構,並添加了文件(使用Visual Studio)手動添加到新項目,以及手動包含和重新建立引用。
另外,請記住將程序集名稱和默認名稱空間設置為與PCL 程序集名稱和默認名稱空間相同 。 通過右鍵單擊項目,然后選擇“屬性”和“應用程序”選項卡,可以找到這些內容:
我知道這聽起來像是無聊的工作,但是請相信我,這並不需要很長時間,而且該過程非常容易出錯。 新項目編譯完成后。 如果沒有,通常很容易找出缺少的內容。 而且,當它起作用時,您知道您是從一開始就開始的,並且您不會拖延會回來並在以后困擾您的內容。
注意 :您可能會遇到.NET Standard中缺少的System。*庫。 如果發生這種情況,請查看是否可以將其添加為NuGet。 它們通常具有4.3。*版本。 例如: System.Net.Security 。
您的PCL也可能依賴與您決定使用的.NET Standard版本或任何.NET Standard版本不兼容的庫。 在第一種情況下,請嘗試看看是否可以使用更高版本的.NET Standard。 在后一種情況下,您目前不走運,但是請注意.NET Standard 2.0,它將提供更廣泛的.NET API支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.