aardio 文档

aardio 范例: C# 使用 dynamic 调用 aardio

//C# 使用 dynamic 调用 aardio

/*
只要简洁,不求完美!
Win7 在市场上已经接近消失,现在开发软件再处处考虑 Win7 兼容是不必要的。
Win10 已自带.NET 4.6 以上,而 .NET 4.x 都支持 dynamic 对象
*/
import dotNet.v4;
var compiler = dotNet.createCompiler("C#"); //创建C#编译器

//必须引入下面的几个 DLL
compiler.Reference(
    "System.Core.dll","Microsoft.CSharp.dll"
);

compiler.Source = /****** 
using System; 
using System.Dynamic;

namespace CSharpLibrary  
{    
    public class Object  
    {   
        //只要将 aardio 对象类型写为 dynamic 就可以自由调用了。
        public object Hello( dynamic aardioObject, dynamic aardioFunction ){

            //调用 aardio 函数
            var num = aardioFunction(12,3,this);

            //修改 aardio 对象属性
            aardioObject.属性名 = num;  

            //调用 aardio 对象函数
            var ret = aardioObject.执行aardio(" console.log('在C#中执行aardio代码') ",this);

            //读 aardio 对象属性 
            return aardioObject.test.abc; 
        } 
    }   
} 
******/

compiler.import("CSharpLibrary"); //自程序集导入名字空间   

//使用 C# 编写的类构造对象实例
var cSharpObj = CSharpLibrary.Object();

var aardioObject =  { 
    test = { abc = 12345;  }
    属性名 = 123; 
    执行aardio = function( code,netObj ){  

         /*
        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 。  
        */
        netObj = dotNet.object(netObj);

        loadcode(code)(); 
        return 123;
    }  
}

import console;
//调用实时编译的 C# 函数
var ret = cSharpObj.Hello( 
    aardioObject,
    function(a,b,netObj){ 
        /*
        这虽然是通过 dynamic 回调的函数。
        但 aardio 函数作为参数传递给 .NET 时,aardio 会自动封装并转换所有回调参数。
        所以这里的 netObj 是 dotNet.object 对象,不需要转换。
        */
        console.log("aardio 函数被 C# 调用了,参数:",a,b)

        //无论.NET 回调是否在同一线程,被 .NET 回调的 aardio 函数总是在原调用线程执行(不必考虑多线程规则与同步)。  

        return a + b; 
    } 
); 

console.dump(ret);
console.dumpJson(aardioObject);
console.pause();
Markdown 格式