# aardio 范例: 在 aardio 中使用 .NET 事件（event ）



```aardio
//在 aardio 中使用 .NET 事件（event ）
import console;
import dotNet; 

var compiler = dotNet.createCompiler("C#");  
compiler.Source = /****** 
namespace CSharpLibrary
{ 
    public class Object
    {
        //定义一个委托类型
        public delegate int TestDelegateType(string str,int a);
        
        //定义一个事件
        public event TestDelegateType onTestEvent; 
        
        public int Value = 123;
  	     
        public int Test( )
        {   
            return onTestEvent("你好",123);
  	    }
    }
}
******/

compiler.import("CSharpLibrary"); //编译 C# 代码并导入命名空间
var netObj = CSharpLibrary.Object();//创建 .NET 对象

/*
.NET 中的 event 实际上是在委托（delegate）上再做了层封装。
在 aardio 中对 event 赋值总是追加而不是覆盖（对delegate 赋值则总是覆盖而不是追加）
*/
netObj.onTestEvent = function(str,a){
	//无论.NET 回调是否在同一线程，被 .NET 回调的 aardio 函数总是在原调用线程执行（不必考虑多线程规则与同步）。  
  	console.log("1、aardio 函数被 C# 调用了,参数:",a,b)
  	
  	//通过属性赋值添加的 .NET 事件内，owner 参数指向 .NET 对象自身
  	console.log("owner.Value===netObj.Value",owner.Value==netObj.Value)
  	
	return 2; //如果不返回委托指定类型的返回值会导致报错，委托返回值类型为 void 时这里可以不返回值。
}
  
//也可以这样追加，追加的用法与委托是一样的
var delgate = dotNet.delegate.combine(
	netObj,"onTestEvent",function(a,b){
    	console.log("2、aardio 函数被 C# 调用了,参数:",a,b)
		return 2; 
	} 
)

//上面的函数会返回追加的委托对象，可以传入下面的函数用于移除事件
//dotNet.delegate.remove(netObj,"onTestEvent",delgate);

//调用 .NET 函数触发事件
netObj.Test();
 
console.pause();
```

