Skip to content
YANG Huan edited this page Sep 10, 2019 · 39 revisions

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

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

  • 大部分指针操作
  • 引用返回(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.如何在代码中调用或者插入lua代码?

  public static void Main(string[] args) {
#if __CSharpLua__
      /*
      [[
      local i = "hello, word"
      print(i)
      ]]*/  
#else
      Console.WriteLine("hello, word");
#endif
      //insert lua code
      /*
      [[
      print('insert lua code')
      ]] 
      */
    }

输出

local Main
Main = function (args) 
  local i = "hello, word"
  print(i)

  --insert lua code
  print('insert lua code')
end

编译时符号__CSharpLua__会被定义

8.如何控制生成的类、方法的名字,如何更改生成的一些行为?

  1. 可以通过命令行参数"-m"提供元数据配置文件(xml格式),来控制一些导出行为。可以参考System.xml来编写,其控制了标准库的一些代码生成规则。
  2. 参考https://github.com/yanghuan/CSharp.lua/wiki/attributes_zh ,目前支持在注释文档中编写少量属性。

9.为什么不再使用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修正与维护、新语法标准的支持等,这对实现一个工业级的编译器至关重要。考虑到不断的维护与实际项目中使用,需要更简洁有力的实现方式。

10. 是否可在非windows环境下运行?

运行环境是.NET Core,可跨平台使用。

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

tolua的支持已经开始实现CSharpLuaForUnity,使用xlua或者slua的需要自行完成适配。

12.如何传递预处理符号?

-csc 参数可以传入C#编译器参数。例如定义DEBUG符号 -csc /define:DEBUG