-
Notifications
You must be signed in to change notification settings - Fork 201
FAQ_zh
原则上所有的C#语法都将支持,目前实现到了C# 7.0,仅以下功能暂时未实现。
- 大部分指针操作
- 引用返回(ref returns,7.0 语法)
使用时如果发现错误,欢迎通过Issues反馈。
具体已经实现的见CoreSystem.lua,后面可能会在增加一些常用的,但是不会再增加多少了,这些已经基本够用了,已经包含了常用集合类以及Linq,CoreSystem.lua库是对照.NET类库的源码实现的,保证了与.NET类库接口的一致性。
默认编译时,会自动引用基础类库中的所有程序集,除此之外的dll需要通过命令行参数'-l'进行加入,需使用完整路径。这样编译会通过,但是需要自行把这些库导入到lua环境,并保证接口调用和命名规则。
转换时仅保存了最为核心的元数据信息,由于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
因为仅保存最为核心元数据信息的原则,默认编译时通过Attribute附加的元数据信息不会进行存储。可以使用命令行参数“-a”进行开启。
枚举使用时会直接转换成常数数值处理,默认就不需要保存其字面量相关的信息, 当需要使用字符信息时,会进行导出,例如使用 typeof、ToString、 Enum.TryPase等操作。
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__会被定义
- 可以通过命令行参数"-m"提供元数据配置文件(xml格式),来控制一些导出行为。可以参考System.xml来编写,其控制了标准库的一些代码生成规则。
- 参考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修正与维护、新语法标准的支持等,这对实现一个工业级的编译器至关重要。考虑到不断的维护与实际项目中使用,需要更简洁有力的实现方式。
运行环境是.NET Core,可跨平台使用。
tolua的支持已经开始实现CSharpLuaForUnity,使用xlua或者slua的需要自行完成适配。
-csc 参数可以传入C#编译器参数。例如定义DEBUG符号 -csc /define:DEBUG