從以前的項目格式遷移到 VS2017 新項目格式

来源:https://www.cnblogs.com/lindexi/archive/2018/01/25/VisualStudio-move-file.html
-Advertisement-
Play Games

以前的項目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的項目文件,後來還是決定不使用這個格式。 VS2017 的項目格式更好讀、更簡單而且減少了 git 衝突。 本文來告訴大家如何從 VS2015 和以前的項目格式修改為 VS2017 項目... ...


以前的項目格式使用的是 csproj 的格式,但是 .net core 支持使用 project.json 格式的項目文件,後來還是決定不使用這個格式。 VS2017 的項目格式更好讀、更簡單而且減少了 git 衝突。

本文來告訴大家如何從 VS2015 和以前的項目格式修改為 VS2017 項目格式。

在遷移之前,我需要告訴大家,現在是2018年1月15日,最新的項目格式只有對下麵的項目支持

  • class library projects 類庫項目
  • console apps 控制項目
  • ASP.NET Core web apps asp 項目
  • .NET Core .NET Core

對於 UWP 和 WPF ,有 xaml 的項目是沒有很好支持,如果你的項目是 WPF 的,那麼請不要再往下看。

現在很多項目,測試項目都使用新格式,建議在測試項目試試

建議從一個測試項目試試,先做好提交,如果失敗可以回滾。

如果創建是庫項目,那麼 csproj 只有下麵的代碼

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>
</Project>

如果創建的是控制項目,那麼只有下麵的代碼

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>
</Project>

如果創建的是測試項目,那麼只有下麵的代碼

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" />
    <PackageReference Include="xunit" Version="2.2.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
  </ItemGroup>
</Project>

如果想知道新格式和之前的區別,如何從以前的格式遷到新的格式,請看下麵

下麵從項目的第一行開始

原來的第一行是

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

新的格式的第一行是

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

可以看到新的格式的代碼比較少

其實建議大家重新創建一個項目,然後把文件放進去,安裝 Nuget 不然需要修改比較多。

必須刪除

下麵的代碼必須刪除

<!-- usually at the top of the file -->
<!-- 下麵的代碼一般在文件的最前 -->
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />

<!-- usually at the bottom -->
<!-- 一般在文件的最後面 -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />

必須修改

需要修改平臺的代碼

這是以前的代碼

<PropertyGroup>
  <!-- ... -->
  <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
</PropertyGroup>

需要修改為下麵的代碼

<PropertyGroup>
  <TargetFramework>net452</TargetFramework>
</PropertyGroup>

如果是 v4.5.2 ,請修改為 net452 ,如果是 v4.6 就修改為 net46

添加文件

現在新的格式可以使用通配添加文件,例如在文件夾的所有的代碼都需要添加,可以使用這個方式

<Compile Include="lindexi\*.cs" />

預設是下麵代碼

<!-- the defaults -->
<Compile Include="**\*.cs" />
<EmbeddedResource Include="**\*.resx" />

所以添加的 cs 文件都會添加到編譯,需要刪除這個代碼才可以不編譯一些文件

項目引用

之前的方式需要添加很多代碼,如引用 ClassLibrary1 的項目,需要寫下麵的代碼

<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
  <Project>{2C7DF870-5B35-49EF-963D-EE1E72C3177E}</Project>
  <Name>ClassLibrary1</Name>
</ProjectReference>

Project 這個可以表示這是一個類庫或一個其他的項目,因為新的項目不需要這個,所以在新建文件的時候就不知道給哪個項目,這是比較差的

新的格式就需要下麵的代碼

<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />

如果引用的項目有依賴,以前的格式需要把引用寫在文件,現在不需要添加引用

假如有 A 引用 B ,B 引用 C ,那麼之前的A項目文件就是這樣

<ProjectReference Include="..\ProjectB\ProjectB.csproj">
  <Project>{A900C843-8340-421B-B4F0-6C65A0D093C4}</Project>
  <Name>ProjectB</Name>
</ProjectReference>
<ProjectReference Include="..\ProjectC\ProjectC.csproj">
  <Project>{871AC142-FC46-49F5-A5E0-90436648B9C5}</Project>
  <Name>ProjectB</Name>
</ProjectReference>

現在的文件格式不需要寫引用

<ProjectReference Include="..\ProjectB\ProjectB.csproj" />

引用包

之前的 Nuget 引用需要添加 packages.config 和 csproj 才可以使用,現在的 Nuget 4 可以直接在 csproj 添加引用

這是之前的格式

<Import Project="..\..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props')" />

<ItemGroup>
  <None Include="packages.config" />

  <Reference Include="MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
  <HintPath>..\..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll</HintPath>
  <Private>True</Private>
</Reference>
</ItemGroup>

新的格式寫引用,不需要 packages.config 文件,這樣減少了找不到nuget的坑,下麵代碼就是新的格式,可以看到代碼減少1/2

<ItemGroup>
  <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
  <PackageReference Include="MySql.Data" Version="6.9.9" />
</ItemGroup>

這個格式可以在git衝突比較容易看到哪裡需要修改,所以解決衝突很簡單

在 nuget 2 的引用,如果引用了包A,他引用了 B ,那麼就需要在 packages.config 引用寫了這幾個項目

<?xml version="1.0" encoding="utf-8"?>
<!-- in packages.config -->
<packages>
  <package id="A" version="2.2.0" targetFramework="net452" />
  <package id="B" version="2.0.1" targetFramework="net452" />
</packages>

現在 Nuget 4 需要寫引用的庫,不需要寫他的引用,所以可以減少代碼,添加了id和版本就好

<ItemGroup>
  <PackageReference Include="A" Version="2.2.0" />
</ItemGroup>

如果在遷移過程遇到詭異的問題,請看將 WPF、UWP 以及其他各種類型的舊樣式的 csproj 文件遷移成新樣式的 csproj 文件 - walterlv

參見:Old csproj to new csproj: Visual Studio 2017 upgrade guide

知識共用許可協議
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 巧妙地使用Interlocked的各個方法,再無鎖無阻塞的情況下判斷出所有線程的運行完成狀態。 昨晚耐著性子看完了clr via c#的第29章<<基元線程同步構造>>,儘管這本書不是第一次看了,但是之前看的都是一帶而過,沒有深入理解,甚至可以說是不理解,實習了之後發現自己的知識原來這麼錶面,很多的 ...
  • 一、基礎準備 1)、 ISERROR(公式) 判斷公式計算結果是否出錯,出錯則返回true,否則返回 false; =IF(ISERROR(原公式),"",原公式) 2)、FIND(find_text,within_text,start_num) (https://baike.baidu.com/i ...
  • 在iframe中獲取父視窗的元素 在父視窗中獲取iframe中的元素 ...
  • 1.功能 實現圖表的數據綁定,動態綁定,屬性更改綁定。 本文提供了一種思路。 2.原理 使用canvas繪製,使用反射來確定屬性的綁定。 3.效果: 柱狀圖效果: 曲線圖效果: 感謝閱讀。 源碼地址: https://files.cnblogs.com/files/lizhijian/ChartBa ...
  • 先看下前端: 寫代碼前先設置: 一:登錄QQ郵箱,點擊設置 二: 三: //下麵開始敲代碼。。。 //兩個命名空間 //using System.Net;//using System.Net.Mail; /// <summary> /// 發送驗證碼按鈕 /// </summary> /// <pa ...
  • .NET Framework 提升與COM組件、COM+服務、外部類型庫和許多操作系統服務進行交互。托管和非托管對象模型之間的數據類型、方法簽名和錯誤處理機制有所不同。 要簡化.NET Framework組件和非托管代碼之間的互操作並簡化遷移路徑,公共語言運行時(CLR)需對客戶端和服務端隱藏這些對 ...
  • 本文告訴大家從文件載入字體。在wpf 使用 fontfamily 顯示指定的 ttf 顯示字體 ...
  • 在網上有一個大神問我這樣的問題:在做UWP的項目,怎麼能讓焦點在點擊在頁面空白處時回到textbox中? 雖然我的小伙伴認為他這是一個 xy 問題,但是我還是回答他這個問題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...