.NET Core是微软力推的新平台,影响力好像还越来越大。为了对这一行业趋势有所准备,最近把自己搞的编程语言的编译器从.NET移植.NET Core,以实现跨平台在Linux上运行,然而失败了。

原因是.NET Core类库中AppDomain、AssemblyBuilder、ModuleBuilder、ILGenerator等等缺失了一些很核心的方法或类型,导致无法编译通过。

核心缺少这些无法编译成功,也不能生成最终的二进制文件。那些以前可以在.NET CLR上运行的开源语言.NET Core对它们来说已经没有了吸引力,现在没有一个跟进到.NET Core上,所以也没有办法从开源项目中获得帮助。比如说Clojure CLR,我下载了它最新的编译器源码,它还是用System.Reflection.Emit命名空间生成IL指令。

微软要在.NET Core上废弃了System.Reflection.Emit那一套东西。我拼命研究的那套生成IL的知识要作废了。这让我想到了Sliverlight、XNA、Windows Phone的下场。我辛辛苦苦钻研到的这部分知识又被归零了,让我想到了刷卡时为零(萨卡什维利外号)。

我又想到现在微软现在是用Roslyn编译C#的,而且Roslyn是开源的。我就下载了Roslyn源码,并且进行了分析。发现源码中PEAssemblyBuilder有一些.NET Core中缺少的方法,但是这个它是internal sealed类,不对外开放,不提供给大家使用。

微软不但在.NET Core上废掉了以前的System.Reflection.Emit,而且不提供新的替代功能,看来它排除其它人,要一己之力建设.NET生态,.NET超越Java的可能性也大致确定。感觉诚意太少。

我感觉那些老外纷纷放弃在.NET上开发语言是明智的。Java平台上不断有Groovy、Scala、Kotlin等等语言出现,在.NET上不可能有了。微软在.NET上是唯一的主宰,想废掉哪个就马上废掉,不需要像Java的JCP组织那样开会投票,也不需要询问.NET程序员的意见,执行效率极高。

缺少的方法或类型如下:

AppDomain

缺少方法

DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access);

AssemblyBuilder

缺少方法

DefineDynamicModule(string name, string fileName, bool emitSymbolInfo);

SetEntryPoint(MethodInfo entryMethod, PEFileKinds fileKind);

Save(string assemblyFileName);

ModuleBuilder

缺少方法

DefineDocument(string url, Guid language, Guid languageVendor, Guid documentType);

ILGenerator

缺少方法

MarkSequencePoint(ISymbolDocumentWriter document, int startLine, int startColumn, int endLine, int endColumn);

LocalBuilder

缺少方法

SetLocalSymInfo(string name);

缺少枚举类型 PEFileKinds

AssemblyBuilderAccess

缺少枚举值

Save,

RunAndSave,

ReflectionOnly

编译器移植到.NET Core失败记录和对.NET未来感想的更多相关文章

  1. 开源纯C#工控网关+组态软件(十)移植到.NET Core

    一.   引子 写这个开源系列已经十来篇了.自从十年前注册博客园以来,关注了张善友.老赵.xiaotie.深蓝色右手等一众大牛,也围观了逗比的吉日嘎啦.精密顽石等形形色色的园友.然而整整十年一篇文章都 ...

  2. ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门

    一.前言 1.本教程主要内容 ASP.NET Core + 内置日志组件记录控制台日志 ASP.NET Core + NLog 按天记录本地日志 ASP.NET Core + NLog 将日志按自定义 ...

  3. .net core日志记录

    .net core日志记录 日志是必须的,目前采用log4net进行日志记录. 定义通用的日志记录方法 public static class Log4NetFunc { private static ...

  4. ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客 上一篇文章中我们已经成功的记录了Request部分的信息,现在我们来看下如何记录Res ...

  5. ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.csd ...

  6. NET Framework项目移植到NET Core上遇到的一系列坑

    原文:NET Framework项目移植到NET Core上遇到的一系列坑 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  7. NET Framework项目移植到NET Core上踩的坑(1)

    本文章向大家介绍NET Framework项目移植到NET Core上遇到的一系列坑,主要包括NET Framework项目移植到NET Core上遇到的一系列坑使用实例.应用技巧.基本知识点总结和需 ...

  8. 记一次Tomcat运行失败记录

    记一次Tomcat运行失败记录 如图tomcat运行之后会出现这样的情况,在网上百度之后大部分都说的是web.xml或者其他配置文件的问题,但是根据网上修改了之后却还是老样子. 这里有比较好的网址可以 ...

  9. 捕获Insert触发器失败记录

    1.背景 环境:发布服务器A Windows2008+SQL2008,分发服务器B Windows2008+SQL2008,订阅服务器C Windows2008+SQL2012发布服务器A上的用户信息 ...

随机推荐

  1. 国际控制报文协议ICMP

    国际控制报文协议ICMP ICMP简介 ICMP 用于主机或路由器报告差错情况和提供有关异常情况的报告(检测网络错误). ICMP 不是高层协议,而是 IP 层的协议. ICMP 报文的格式 ICMP ...

  2. sublime 安装Anaconda插件 配置python开发环境

    我的sublime 3  python 3.6.6 安装Anaconda插件 由于Anaconda插件本身无法知道Python安装的路径,所以需要设置Python主程序的实际位置.选择Settings ...

  3. 何用Java8 Stream API进行数据抽取与收集

    上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据 ...

  4. python 实现各种进度条

    1. 时间进度条 class Tiao(object): def __init__(self): self.obj1 = datetime.timedelta(seconds=1) self.var ...

  5. 大马提权详细过程webshell到提权

    .在shell路径这一栏里输入服务器端cmd.exe对应的绝对路径,这里用我们刚刚上传上去的smallchao.exe 8.WINDOWS常见命令:net user 查看所有用户query user ...

  6. 微信小程序状态管理工具 JStore

    微信小程序状态管理工具 JStore 闲着没事做,就想着给微信小程序写一个状态管理工具,名叫 JStore,这个状态管理工具是仿照 vuex 的几个方法来写的,所以有 vuex 的基础同学很容易理解. ...

  7. Webpack 核心开发者 Sean Larkin 盛赞 Vue

    dev.io 近日邀请了 Webpack 核心开发者 Sean Larkin 回答开发者提问,其中几个问提比较有意思,和掘金的小伙伴们分享一下. 先上点前菜: 有一个开发者问 Sean 如何成为一个热 ...

  8. 【jQuery学习日记】jQuery实现滚动动画

    需要实现的效果 样式分析: 2个主要部分,头部的标题和导航部分,和主要的功能实现区域: 1.头部 <div id="header"> <h1>动漫视频< ...

  9. 前端开发--nginx番外篇

    Centos7下Nginx开发使用(背景: 阿里云ECS Centos7) 安装和启动 安装教程 Centos7安装Nginx实战 需要主意的如下: 文中第四步 4.配置编译参数命令:(可以使用./c ...

  10. C# 简单地使用下 音频解码器Bass.Net

    在C#中有许多音频播放的方案,例如WinForm里调用系统自带MediaPlayer的COM组件和WPF的MediaPlayer(实质上还是WindowsMediaPlayer) 以及一堆API播放和 ...