環境
首先要下載.NET Core 3.0 與Visual Studio 2019
編輯 csproj 文件
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>
恢復 NuGet 包
找到package.config文件右擊選擇Upgrade to PackageReference 但是我會彈框
我也不知道該怎麼解決,搜了一圈沒搜到,如果有知道的可以在評論區告訴我,於是我就老老實實將
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Dapper" version="1.50.2" targetFramework="net45" />
<package id="EntityFramework" version="6.0.0" targetFramework="net45" />
<package id="MySql.Data" version="6.7.9" targetFramework="net45" />
<package id="System.Data.SQLite" version="1.0.108.0" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.108.0" targetFramework="net45" />
<package id="System.Data.SQLite.EF6" version="1.0.108.0" targetFramework="net45" />
<package id="System.Data.SQLite.Linq" version="1.0.108.0" targetFramework="net45" />
</packages>
改爲下列代碼,並寫到csproj文件中在 project的子節點中
<ItemGroup>
<PackageReference Include="Dapper" Version="1.50.2" />
<PackageReference Include="EntityFramework" Version="6.0.0" />
<PackageReference Include="MySql.Data" Version="6.7.9" />
<PackageReference Include="System.Data.SQLite" Version="1.0.108.0" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.108.0" />
<PackageReference Include="System.Data.SQLite.EF6" Version="1.0.108.0" />
<PackageReference Include="System.Data.SQLite.Linq" Version="1.0.108.0" />
</ItemGroup>
增加引用
同時,有些dll是 .net framework獨有,而 .net core因爲各種原因並沒有引用進來的。參考Porting to .NET Core。如以下幾個是需要重新引用的:
- System.Data。雖然基礎層已經是 .NET Core的一部分,即提供者模型和SQL客戶端,但目前還沒有一些功能,例如架構支持和DataTable/ DataSet。
- System.DirectoryServices。.NET Core目前不支持與LDAP或Active Directory通信。
- System.Drawing。雖然嚴格來說它是客戶端API,但許多開發人員在服務器上使用繪圖API來提供縮略圖生成或水印。我們目前在 .NET Core中不支持這些API。
- System.Transactions。雖然ADO.NET支持事務,但不支持分佈式事務,其中包括環境事務和登記的概念。
- System.Xml.Xsl和System.Xml.Schema。.NET Core支持XmlDocumentLinq XDocument,包括XPath。但是,目前不支持XSD(XmlSchema)或XSLT(XslTransform)。
- System.Net.Mail。目前不支持使用這些API從 .NET Core發送電子郵件。
- System.IO.Ports。.NET Core目前不包括與串行端口通信的功能。
- System.Workflow。Windows Workflow Foundation(WF)目前在 .NET Core上不可用。
- System.Xaml。在創建UWP應用程序時,開發人員將使用WinRT XAML API。因此,.NET Core目前不包含託管XAML框架,該框架包括解析XAML文檔和實例化描述的對象圖的能力。
在我的項目中,我引用了這些:
<ItemGroup>
<Reference Include="System.Data"/>
<Reference Include="System.Xaml"/>
<Reference Include="System.Transactions"/>
<Reference Include="System.Drawing"/>
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Net.Http" />
</ItemGroup>
增加其他文件
增加了如下幾個項目本身就有的文件
<ItemGroup>
<None Include="App_Data\data.db" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config">
<SubType>Designer</SubType>
</None>
</ItemGroup>
最終的csproj文件
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="1.50.2" />
<PackageReference Include="EntityFramework" Version="6.0.0" />
<PackageReference Include="MySql.Data" Version="6.7.9" />
<PackageReference Include="System.Data.SQLite" Version="1.0.108.0" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.108.0" />
<PackageReference Include="System.Data.SQLite.EF6" Version="1.0.108.0" />
<PackageReference Include="System.Data.SQLite.Linq" Version="1.0.108.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Data"/>
<Reference Include="System.Xaml"/>
<Reference Include="System.Transactions"/>
<Reference Include="System.Drawing"/>
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Net.Http" />
</ItemGroup>
<ItemGroup>
<None Include="App_Data\data.db" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Include="App.config">
<SubType>Designer</SubType>
</None>
</ItemGroup>
</Project>
移植過程中遇到的問題
.net core不支持Access數據庫
我的代碼中有帶Access數據庫相關代碼,都報了缺少程序集引用的錯誤,因此我初步增加了引用
<ItemGroup>
<Reference Include="System.Data"/>
<Reference Include="System.Data.OleDb"/>
</ItemGroup>
但是還是沒用,參考了.NET Core Data Access,發現是.net core不支持Access的原因,因此都把這段代碼用條件編譯代碼 #if 給包起來了。
缺少hostfxr.dll文件
編譯成功後運行項目發現彈這個窗口,我查了下C:\Program Files\dotnet文件中是存在hostfxr.dll的,看了環境變量也是手動設置了DOTNET_ROOT變量的,但是總是出錯,沒辦法,最後通過複製hostfxr.dll文件到bin\Debug\netcoreapp3.0\下才運行成功