写点什么

重新设定.NET 代码的目标平台

  • 2016-02-15
  • 本文字数:1473 字

    阅读完需:约 5 分钟

自从.NET 平台问世以来,随着多年的发展与流行度的不断增长,它已经逐渐扩展到了多个平台与设备上。如果开发者想要将他们的项目从一个平台移植到另一个平台上,他们经常会面对一个难题:如何确定他们的代码使用了哪些 API,而目标平台又提供了哪些 API。微软最近推出了.NET 可移植性分析器(NPA —— .NET Portability Analyzer),能够使迁移的过程得到简化。

来自微软的 Taylor Southwick 与 Connie Yao 参加了由 Seth Juarez 所主持的一次 Channel 9谈话,他们的话题包括NPA 的功能,以及开发者如何在自己的项目中使用这一工具。NPA 的设计目标是帮助开发者处理在由一个平台转换至另一个平台时所遇到的问题。该工具对于源平台与目标平台的选择没有限制,这就意味着开发者可以进行任意类型的迁移。(举例来说,开发者可以从Widows Phone 迁移至Silverlight,或从Xamarin.Android 迁移至.NET Core。)

NPA 在执行时要指定源项目,它可以分析出项目中使用了哪些 API,以及转换至新的目标平台时需要进行哪些改动。当前所支持的平台包括:

  • .NET Framework 的每个桌面版本
  • Silverlight
  • Xamarin
  • Mono 3.3
  • Windows 8
  • Windows Phone
  • .NET Core

请注意,虽然开发者可以选择使用离线分析模式,但在默认情形下,所分析的代码信息将通过 web 服务发送给微软。整个分析过程将生成一个 API 列表,并发送给某个 web 服务(可移植性服务),该服务能够确定可用的目标,以及每种目标所具备的 API。在分析过程结束之后将为用户生成一份报告,包含了“可移植性索引”信息,其中含有你所使用的 API 中有多少比例是在其他平台中不可用的细节信息。但该报告并不会告诉你这些 API 使用了多少次,只会告诉你是否使用过某个 API(也就是说,无论某个 API 使用了 1 次或是 100 次,分析结果的评分都是一样的。)

在分析过程中使用 web 服务的原因有两个。微软希望通过一种简单的方式让分析功能保持更新,并且通过这种方式了解客户使用了哪些 API。这些信息也将帮助微软决定有哪些 API 应该从桌面版本中移植到“次世代”的版本中,即.NET Core、ASP.NET 等等。

如果有人对于这种方式存在隐私方面的顾虑,或者在他们的开发环境中无法访问互联网,那么 NPA 还提供了一种离线模式,可以通过重编译 NPA 以支持这一模式。微软已尽力减少通过 web 服务发送至服务器的信息,作为这一简化流程的一部分,NPA 会尝试确定哪些代码是微软的 API、哪些代码是客户自行编写的 API,并仅发送微软的 API 数据。此外,还可以通过一个命令行选项查看发送给微软的信息。通常来说,以下信息将发送至微软服务器:

  • 所使用的 API
  • 所引用的程序集
  • 你的代码所在的程序集的名称

该工具将提供三种不同的报告格式:

  • HTML 报告 —— 对于你的代码库的可移植性给出一个总体概述
  • Excel 电子表格 —— 可为 API 的使用提供过滤数据
  • JSON 文件格式同样可用 —— 可将该文件与其他程序工具相结合,提供进一步的行为

作为微软开源计划的一部分,NPA 的源代码托管在 GitHub 平台。除了命令行工具之外,还可以通过一个扩展在 Visual Studio 中使用 NPA 功能。可以在 extension gallery 中找到该扩展,在VS2013 及VS2015 中使用。

在Visual Studio 中使用该工具除了能够生成报告之外,还有一个额外的好处。它能够以编辑器消息的方式指出你的代码中出现的可移植性问题,因此,每个有冲突的API 调用都会指向你的代码中的实际位置。如果可能的话,它还能够建议你如何对代码进行修正。通过它还能跳转至特定的代码调用之处,这将为你节省大量的时间。(请注意,当前版本的Visual Studio 扩展仅支持HTML 格式的报告。)

查看英文原文: Retargeting .NET Code

2016-02-15 18:002523
用户头像

发布了 428 篇内容, 共 193.6 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

算法分析关键

Geek_0b8195

算法和数据结构

架构师训练营 1 期 -- 第五周作业

曾彪彪

极客大学架构师训练营

架构必修:领域边界划分方法--职责驱动设计(RDD)

马迪奥

架构 领域 架构师 RDD

聊聊技术人员如何学习成长

架构精进之路

职业成长

一个草根的日常杂碎(10月18日)

刘新吾

随笔杂谈 生活记录 社会百态

利用区块链等技术,加强对交通运输信用信息的归集共享和分析应用

CECBC

区块链 交通运输

分布式下,我想要一致性

架构师修行之路

分布式 微服务

架构师必备的那些分布式事务解决方案!!

架构师修行之路

分布式 微服务 架构设计

Flink窗口算子-6-8

小知识点

scala 大数据 flink

数据结构与算法系列之链表操作全集(一)(GO)

书旅

数据结构 数据结构和算法 Go 语言

万物互联的IoT时代,柔性电子会大行其道吗?

脑极体

typora增强-mac

老菜鸟

Typora

解析 CloudQuery 审计分析功能

BinTools图尔兹

数据库 sql 安全 工具软件

一个草根的日常杂碎(10月19日)

刘新吾

随笔杂谈 生活记录 社会百态

二十、深入Python迭代器和生成器

刘润森

Python

1分钟带你入门 React 公共逻辑抽离HOC...

Leo

大前端 React Hooks HOC Render Props

第四周作业

dll

一个草根的日常杂碎(10月20日)

刘新吾

随笔杂谈 生活记录 社会百态

央行数字货币离我们还有多远?

CECBC

数字货币

【线上排查实战】AOP切面执行顺序你真的了解吗

Zhendong

spring aop

甲方日常 35

句子

工作 随笔杂谈 日常

mongodb 源码实现、调优、最佳实践系列-百万级代码量mongodb内核源码阅读经验分享

杨亚洲(专注MongoDB及高性能中间件)

MySQL mongodb 源码 中间件 分布式数据库mongodb

架构训练营学习笔记之五技术选型(一)

于成龙

架构训练营

Nginx 在运维领域中的应用,看这一篇就够了

华章IT

nginx Linux 运维工程师

深入java week1-01 字节码、内存、GC、调试工具

闷骚程序员

Go语言内存管理三部曲(三)图解GC算法和垃圾回收原理

网管

内存管理 垃圾回收 GC GC算法 Go 语言

Linux的上手命令

Linux 常用命令

java week1练习

闷骚程序员

年纪轻轻怎么就卵巢早衰了?试管可帮忙!

Geek_65d32f

试管 三代试管

vivo 商城前端架构升级—前后端分离篇

vivo互联网技术

Java 大前端 前后端分离

游戏数值策划之常用excel函数

吴优秀同学

Excel 游戏

重新设定.NET代码的目标平台_.NET_Jeff Martin_InfoQ精选文章