参考将现有应用程序移植到.net core 3.0

环境

首先要下载.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, core不支持access的原因,因此都把这段代码用条件编译代码 #if 给包起来了。

缺少hostfxr.dll文件

编译成功后运行项目发现弹这个窗口,我查了下c:\program files\dotnet文件中是存在hostfxr.dll的,看了环境变量也是手动设置了dotnet_root变量的,但是总是出错,没办法,最后通过复制hostfxr.dll文件到bin\debug\netcoreapp3.0\下才运行成功

到此这篇关于如何将winform移植到.net core 3.0的文章就介绍到这了,更多相关winform移植到.net core 3.0内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!