Skip to content
YANG Huan edited this page Jun 4, 2018 · 39 revisions

1.哪些C#语法不支持?

原则上所有的C#语法都将支持,目前实现到了C# 7.0,仅以下功能暂时未实现。

  • async & await
  • 大部分指针操作
  • 引用返回(ref returns,7.0 语法)

使用时如果发现错误,欢迎通过Issues反馈。

2.支持哪些.NET类库?

具体已经实现的见CoreSystem.lua,后面可能会在增加一些常用的,但是不会再增加多少了,这些已经基本够用了,已经包含了常用集合类以及Linq,CoreSystem.lua库是对照.NET类库的源码实现的,保证了与.NET类库接口的一致性。

3.如果使用到了除基础类库以外的怎么办?

默认编译时,会自动引用基础类库中的所有程序集,除此之外的dll需要通过命令行参数'-l'进行加入,需使用完整路径。这样编译会通过,但是需要自行把这些库导入到lua环境,并保证接口调用和命名规则。

4.是否支持反射?

转换时仅保存了最为核心的元数据信息,由于lua是动态语言天然支持很多动态的操作,所以通过字符串创建类,调用方法等也是可以的。为保证C#的接口要求,也已经实现部分反射的接口,但是需要依赖复杂元数据信息的无法支持,例如获取指定名称与参数类型获取MethodInfo对象。可以使用C# dynamic关键字简化相关代码。

C#

public void TestDynamic(object obj) {
    dynamic a = obj;
    int name = a.Name;
    int age = a.Age;
    int money = a.Got();
}

lua

local testDynamic
testDynamic = function (this, obj) 
    local a = obj
    local name = a.Name
    local age = a.Age
    local money = a:Got()
end

5.Attribute支持

因为仅保存最为核心元数据信息的原则,默认编译时通过Attribute附加的元数据信息不会进行存储。可以使用命令行参数“-a”进行开启。

6.枚举没有导出?

枚举使用时会直接转换成常数数值处理,默认就不需要保存其字面量相关的信息, 当需要使用字符信息时,会进行导出,例如使用 typeof、ToString、 Enum.TryPase等操作。

7.为什么不再使用Bridge.lua?

Bridge.lua是在Bridge.NET基础上修改扩展而来的,Bridge.NET使用的是NRefactory来解析语法树,这个库已经不再维护,已经被Roslyn所替代,使用Roslyn才能更好的支持C# 6.0以及未来的语法标准(Bridge.NET在17版本有计划切换至Roslyn),且Bridge.NET使用的是字符串拼接生成代码的方式,而CSharp.lua是先输出lua AST,再输出lua源码,这种实现方式的差异导致CSharp.lua在以下几点拥有巨大的优势,代码简洁以及可读性、编译速度、Bug修正与维护、新语法标准的支持等,这对实现一个工业级的编译器至关重要。且我个人认为Bridge.NET整体代码质量较为一般,考虑到不断的维护与实际项目中使用,需要更简洁有力的实现方式。

8.Can I run it in a non-Windows environment?

The operating environment is. NET Core, which can be used across platforms.

Clone this wiki locally