|
下面是某**编程语言处理C#源码时的例子,对比现在火山,他的方法确实方便很多。
//运行时编译C#
import console;
console.open()
import dotNet;
//创建应用程序域(无参数创建唯一实例,不必手动释放)
var appDomain = dotNet.appDomain();
//创建C#语言编译器
var compiler = appDomain.createCompiler("C#");
compiler.Reference("System.dll")
//设置待编译C#源码
compiler.Source = /******
using System;
using System.Reflection;
using System.Collections;
namespace CSharpLibrary
{
public class AardioTable
{
private object tObject;
public AardioTable(object obj){
tObject = obj;
}
public object GetProperty(string k){
return tObject.GetType().InvokeMember(k, BindingFlags.GetProperty, null, tObject, null);
}
public void SetProperty(string k,object v){
tObject.GetType().InvokeMember(k, BindingFlags.SetProperty, null, tObject, new object[] { v });
}
public object InvokeMember(string k,params/*不定个数参数*/ object[] arg ){
return tObject.GetType().InvokeMember(k, BindingFlags.InvokeMethod, null, tObject, arg );
}
}
public class CSharpObject
{
public object Hello( object comObject ){
AardioTable tab = new AardioTable( comObject );
tab.SetProperty( "属性名",456 ) ;
tab.InvokeMember( "执行aardio", " console.log('在C#中执行aardio代码') " );
IEnumerator enumerator = (comObject as IEnumerable).GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine( "C#中遍历aardio对象键名:" + enumerator.Current );
}
return tab.GetProperty("属性名");
}
public int [] Test( double a, int [] b){
b[0] = b[0] + (int)a;
return b;
}
}
}
******/
//编译并返回程序集
var assembly = compiler.Compile()
console.log(compiler.getLastError())
//调用程序集创建类对象
var cSharpObject = assembly.new("CSharpLibrary.CSharpObject")
//调用实时编译的C#函数
var ret = cSharpObject.Hello( {
属性名 = 123;
执行aardio = function( code ){
loadcode(code)();
}
} ); |
|