Skip to content
YANG Huan edited this page Jul 21, 2017 · 39 revisions

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

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

  • Nullable 相关操作
  • async & await
  • 指针
  • 部分Linq 表达式语法,例如let语句

2.支持哪些.NET类库?

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

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

默认编译时,会自动引用“mscorlib.dll;System.dll;System.Core.dll”,其余dll需要通过命令行参数'-l'进行加入。.net framwrok的dll仅使用文件名即可,其它dll需使用完整路径。这样编译会通过,但是需要自行把这些库导入到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使用的是字符串拼接直接生成代码的方式,而CSharp.lua是先输出lua AST,再输出lua源码,这种实现方式导致CSharp.lua在以下几点拥有巨大的优势,代码简洁以及可读性、编译速度、Bug修正、新语法标准的支持等,这对实现一个工业级的编译器至关重要。

8. 是否可以支持.NET Core?

尝试移植过,发现部分api在.NET Core 2.0才会支持,目前.NET Core 2.0还没有Release,等正式发布后,会切换到.NET Core 2.0。

9.Unity3D的Lua热更新解决方案的支持

按照问题3的答复自行处理,使用ulua, slua, tolua, xlua 等等的,均需要自行完成适配工作,由于开发此工具时,项目已经近乎完成,也已经支持服务器端代码导出为lua提供给客户端使用,就没有再进行支持Unity环境的开发。

Clone this wiki locally