aardio 文档
aardio 范例: InvokeMember
//InvokeMember
import dotNet;
var compiler = dotNet.createCompiler("C#");
compiler.Parameters.CompilerOptions = "/optimize";
compiler.Source = /******
using System;
using System.Reflection;
using System.Collections;
namespace CSharpLibrary
{
public class DynObject : IEnumerable
{
private object target;
private Type type;
public DynObject(object aardioObject) { target = aardioObject; type = target.GetType(); }
IEnumerator IEnumerable.GetEnumerator() {return (target as IEnumerable).GetEnumerator(); }
public object InvokeMember(string method, params object[] args) { return type.InvokeMember(method, BindingFlags.InvokeMethod, null, target, args); }
public object InvokeMember(int dispId, params object[] args){ return type.InvokeMember("[DispId=" + dispId + "]", BindingFlags.InvokeMethod, null, target, args); }
public object Invoke(params object[] args) {return type.InvokeMember("", BindingFlags.InvokeMethod, null, target, args); }
public object this[string index]
{
get { return type.InvokeMember(index, BindingFlags.GetProperty, null, target, null); }
set { type.InvokeMember(index, BindingFlags.SetProperty, null, target, new object[] { value }); }
}
}
public class Object
{
public object Hello(object aardioObject)
{
//转换 aardio 对象
DynObject tab = new DynObject(aardioObject);
//调用成员函数
tab.InvokeMember("执行aardio", " console.log('在C#中执行aardio代码') ");
//调用 对象自身(如果对象不是函数而是表,调用表对象的 _call 元方法)
tab.Invoke(12, 3, this);
//遍历 aardio 对象
foreach (object item in tab)
{
Console.WriteLine("C#中遍历aardio对象键名:" + item);
}
//修改属性
tab["属性名"] = 456;
//读取属性
return tab["属性名"];
}
}
}
******/
compiler.import("CSharpLibrary");
//使用 C# 编写的类构造对象实例
var cSharpObject = CSharpLibrary.Object();
import console;
var aardioObject = {
属性名 = 123;
执行aardio = function( code ){
loadcode(code)();
return 123;
};
@{
_call = function(a,b,netObject){
/*
aardio 函数传给 .NET 时(委托、事件),
aardio 会在原函数外包装一层代理函数,并自动处理回调参数。
回调 aardio 函数的参数中的 .NET 对象会自动封装为 dotNet.object 。
但 .NET 反过来直接回调 aardio 对象的成员函数时,
回调 aardio 函数的参数中的 .NET 对象没有经过处理,不会自动封装为 dotNet.object 。
原生 .NET 对象在 aardio 中存为 COM 对象,
而原生 COM 接口不支持 .NET 的很多特性,例如重载(函数名相同,参数不同)。
.NET 原生对象传入 com.IsNetObject() 会返回非 0 值。
而 dotNet.object 传入 dotNet.getObject() 会返回非 null 值。
解决方案:
如下将原生 .NET 对象转换为 aardio 中的 dotNet.object 。
*/
netObject = dotNet.object(netObject);
//无论.NET 回调是否在同一线程,被 .NET 回调的 aardio 函数总是在原调用线程执行(不必考虑多线程规则与同步)。
console.log("aardio 对象被 C# 调用了,参数:",a,b)
return a + b;
}
}
}
//调用实时编译的 C# 函数
var ret = cSharpObject.Hello( aardioObject );
console.dump(ret);
console.dumpJson(aardioObject);
console.pause();
Markdown 格式