不能使用clr编译c文件 怎么强制用clr_编译器移植到.NET Core失败记录和对.NET未来感想...

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

4086f1f68e97f0c83b81800deebb49c0.png

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

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

d118237c0d60bf069eec37267ef48035.png

微软要在.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程序员的意见,执行效率极高。

f29ff45f867b26eb18e4f53b96ad3665.png

缺少的方法或类型如下:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值