如何迁移#SNMP到.NET Core平台的一些体会

.NET Core 依然在飞速进化中,所以如果不是非常喜欢折腾的性格,建议各位还是暂时忍耐。

准备阶段

首先,Visual Studio 2015是必要的开发工具。虽然它已经包含了.NET Core的原始测试版,这里还是推荐下载 RC1 安装包,

http://get.asp.net

请下载 ASP.NET 5 RC 那个版本。下面都是假设在 Windows 系统上。

执行安装程序,它会进一步下载更多的部件。等到安装完成,就可以进行 .NET Core RC1程序的开发。

下面让我们进一步升级到 RC1 Update 1这个升级版本:

  1. 打开 Visual Studio Command Prompt。

  2. 执行”dnvm upgrade”命令。

  3. 再执行”dnvm list”命令。

如果一切正常,那么这时候输出应该是这样的,

C:\Program Files (x86)\Microsoft Visual Studio 14.0>dnvm list

Active Version           Runtime Architecture Location                     Alias
—— ——-           ——- ———— ——–                     —–
       1.0.0-rc1-final   clr     x86          C:\Users\lextm\.dnx\runtimes
       1.0.0-rc1-update1 clr     x64          C:\Users\lextm\.dnx\runtimes
  *    1.0.0-rc1-update1 clr     x86          C:\Users\lextm\.dnx\runtimes default
       1.0.0-rc1-update1 coreclr x64          C:\Users\lextm\.dnx\runtimes
       1.0.0-rc1-update1 coreclr x86          C:\Users\lextm\.dnx\runtimes


开始迁移

下面可以开启 Visual Studio 2015,并且创建一个类型是 Class Library (Package) 的新工程(Visual Studio 2015 Update 1似乎把这个工程类型改名了,研究中)。这种工程的文件后缀是.xproj。这种工程的编译结果会是一个 NuGet 包。

在往里面加入新东西之前,我们先来研究一下 project.json 文件。

需要注意的是 project.json 是全新的管理依赖项的方式,它既代替了原来管理 NuGet 包的 packages.config,也替代了原来 .csproj 工程文件中管理引用的部分。

一个范例是 #SNMP Library 现在使用的 project.json 文件,

https://github.com/lextm/sharpsnmplib/blob/netcore5/SharpSnmpLib/project.json

从中我们可以看到,既有用来描述 NuGet 包的各种元数据信息,也包含依赖项。

其中比较主要的部分是它指明了两个平台别名(moniker),一个是 .NET Framework 4.5.1(net451),另一个是 .NET Platform Standard 5.4(dotnet5.4)。

前者有一个基本的引用列表,所以不太需要指明具体库的应用,但是比较特殊的是 System.Runtime.Serialization,所以它是唯一需要写明的一个引用。

而后者怎是一个新的别名,用来标识一个包含完整 API 清单的 .NET 平台。凡是支持这个平台标准5.4版本的 CLR 实现(不限 .NET Framework,Mono 或者 Xamarin),都可以使用我们编译之后的 NuGet 包。关于平台标准的细节可以阅读下面的文档,

https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md

不过它已经更新 RC2 的版本,所以版本号已经改为从1.0计算了。

面向平台标准开发的一大困扰就是所有的引用都需要手工指明。而这些引用也最后来自于对应的 NuGet 包。那么怎么寻找这些包和它们的对应版本呢?

简单来说,步骤就是将要迁移的项目代码手工拷贝到新工程里,然后编译。凡是找不到的类型,我们使用微软临时发布的一个查询网站

http://packagesearch.azurewebsites.net

来查询包含它的 NuGet 包和版本。这是一个有点费时间的过程,因为

  • 有些类型是 RC1不存在的,而且可能也不会出现在 RC2等后续版本。于是需要换变通的方式。

  • 有些类型在后续版本中会有,那么需要等待。

  • 有些类型仅仅出现在桌面版本的 .NET Framework 中于是需要条件编译。

因为仅仅作为一个测试,所以我在迁移 #SNMP Library 过程中就删去了很多代码。另外由于 Socket 类型的同步方法都被移除,我也不得不将很多 #SNMP Library 的代码改写为 async/await 方式。等微软正式发布 RC2,我会考虑再迁移一部分代码过去。

到此,只要编译通过,那么初步的迁移工作也就结束了。


写在最后

还有其他值得注意之处:

  • 和 project.json 对应,Visual Studio 会维护一个 project.lock.json 文件。这个文件详细记录了依赖项展开的情况,了解它的结构有利于调试一些依赖项问题。但是不要将它签入到版本控制。

  • .xproj 工程不像 .csproj 那样需要明确指示工程包含的源文件,而是默认将同一文件夹下面所有源文件引入。因此有可能迁移过程中需要调整下工程文件的组织。

  • 暂时没有特别方便的单元测试集成。后面应该会有。

  • dotnet5.x 是个临时的别名,后面都会改成 netstandard1.x。

上面仅仅谈到了迁移过程中最为重要的步骤。一些工具,如 dnvm 由于 RC2 起会被 dotnet 工具取代,所以都没有详细介绍。现在这个阶段,还是浅尝辄止比较经济实惠。

敬请关注后续文章。


相关文章

原文地址:https://blog.lextudio.com/2016/03/how-to-port-snmp-library-to-net-core-zh/


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA实现一个图片上传预览功能

这个小项目主要使用java实现了一个简单的图片上传预览功能,废话不多说,先上实现成果 ^ _ ^💯 预览 登录页 主页 上传页 图片预览 项目架构 后端: SpringBoot shiro mybatis-plus druid hutool 前端: layui viewer 项目结构 ├─src├…

小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难

PLC实质上是工业计算机,是计算机技术与传统继电接触器控制器技术相结合的产物,只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言。一、PLC的结构从硬件结构上看,PLC主要由中央处理单元(CPU)、存…

内部局域网可自行分配的ip地址

【1】有些ip地址很特殊 以 10. 、 172.16. 、172.31. 、192.168. 开头的所有ipv4地址都未分配。 更确切的说,这些地址不会被 ISP(Internet服务提供商)分配给广域网上的计算机,即无法加入全球Internet网络-广域网; 但…

以吃货的角度理解 IaaS,PaaS,SaaS 是什么

转载自 以吃货的角度理解 IaaS,PaaS,SaaS 是什么随着云计算时代的到来,越来越多的软件,开始采用云服务。越来越多的概念也随之而来。云服务只是一个统称,可以分成三大类。IaaS:基础设施服务,Inf…

.Net使用RabbitMQ详解

序言 这几天呢,公司风波再起,去年一年公司CTO换啦4任,CEO换啦三个,这不刚来个新老大,感觉还不错,却没干过3个月又要走,索性趁老大们走来走去的时候,就给自己空出来,稍稍总…

SpringBoot整合Redis要注意的那些

前言 昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig,错误很明显找不到需要的类。下面主要记录一下错误是怎么出线的,并且如何解决。 错…

Java之Socket与HTTP区别

转自: Java之Socket与HTTP区别 - 曹刚 - 博客园我们都知道TCP/IP协议共分四层:①链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他…

人人都能掌握的Java服务端性能优化方案

转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验。如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应。这就可能导致用户投诉甚至用户的流失。 关于性…

python模板模式_python-模板方法模式

说明: 模板方法模式时行为模式中比较简单的设计模式之一。模板方法关注这样的一类行为:该类行为在执行过程中拥有大致相同的动作次序,只是动作在实现的具体细节上有所差异。例如:泡茶和泡咖啡,泡茶:把水煮沸…

nacos启动失败:org.springframework.boot.web.server.WebServerExceptio

准备环境 系统环境: windows nacos: 2.0.0-BETA 错误信息 org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat 配置文件…

post使用form-data和x-www-form-urlencoded的本质区别

转自: post使用form-data和x-www-form-urlencoded的本质区别_null-CSDN博客一是数据包格式的区别,二是数据包中非ANSCII字符怎么编码,是百分号转码发送还是直接发送一、application/x-www-form-urlencoded1、它是post的默认格式,…

使用Nancy打造TaskManager2.0管理系统

上一篇开源任务管理平台TaskManager介绍发布后,有网友联系我看看能不能做个后台管理界面,方便管理系统中所有的任务。由于时间和技术问题1.0版本的时候,新增了一个3分钟读取配置文件动态修改任务的功能,不过总体来说还是不直观&am…

Java对象的序列化与反序列化

转载自 Java对象的序列化与反序列化 序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的…

网站能拿到其他网站的cookie_网站能给公司带来哪些好处?

事实上,许多企业仍在努力建立一个网站,因为如果它建立起来,它需要一笔钱和其他费用。但此时客户业务不太好,企业客户需要考虑很多问题,但创建网站的企业已经尝到了甜头。其实有些朋友可能会有一些偏差。例如&#xff0…

笨办法学习@ConditionalOnProperty 烧脑配置记录

前言 今天继续学习springboot时,一不小心就被ConditionalOnProperty注解的配置真假搞得我真的变得真真假假了。。(此为真,彼为假,到底你是真还是你是假,晕了晕了。。。) 本片主要记录一下注解的真假情况 …

javaI/O流小结

【README】 1.本文总结java IO读取或写入数据的方式和相关类说明; 2.java IO建立在流之上的。输入流读取数据,输出流写入数据; 3.过滤器流-filter stream,可以串连(修饰)到输入流和输出流上;…

送给微软中文.NET社区的一份礼物,.NET FM

自报家门 大家好,我是.NET FM。做为一档专业而轻松的播客节目,在今后的日子里,我将为你奉上有关.NET和微软公司其他技术的新鲜资讯(偷偷讲下,还有各种八卦哦)。 Lex Li的回忆 认识吕鹏同学真的是非常偶然…

你真的以为你了解Java的序列化了吗

转载自 你真的以为你了解Java的序列化了吗 上一篇文章《Java对象的序列化与反序列化》中,简单介绍了Java中对象的序列化和反序列化的一些基础知识。看文那篇文章后,有小伙伴留言说:我终于了解了Java的序列化了。我只想说:小伙子&a…

SpringBoot配置mybatis-mysql数据源

前言 学习SpringBoot整合mybatis mysql配置,首先需要了解什么是ORM(对象映射关系)框架,ORM(Object Relational Mapping)对象关系映射,是 一种为了解决面向对象与关系型数据库不匹配而出现的技术,使开发者…

编程猜单词游戏python_Python实现简单的猜单词小游戏

本文实例为大家分享了Python实现猜单词小游戏的具体代码,供大家参考,具体内容如下 思路 1、一个words列表里存放若干的单词,例如:["extends", "private", "static", "public"]2、在words…