首页 > 编程语言 > AAuto > AAuto跨越式更新:新增 dotNet 支持库,可方便的调用.Net 组件
2012
10-04

AAuto跨越式更新:新增 dotNet 支持库,可方便的调用.Net 组件

转自快手论坛:http://www.aau.cn/thread-8273-1-1.html

AAuto 新增 dotNet 支持库,可方便的调用.Net 组件。
可使用内存字符串嵌入.Net组件,DLL可添加到工程内嵌资源目录,可通过标准com接口交互,使用非常方便。
该支持库代码开源( 可在标准库中双击查看源码 )。

1、创建.Net虚拟机

import dotNet;
var clr,err = dotNet.clr( “v2.0” );

2、创建应用程序域

//创建应用程序域( 属于进程之下,但在线程之上的程序管理容器 )
var appDomain = clr.createAppDomain();


3、引用系统组件,并实例化类对象

//system默认已加载,可通过 appDomain.system 直接引用该程序集
system = appDomain.load(“System.Windows.Forms”);
var Form = system.CreateInstance( “System.Windows.Forms.Form” )
Form.Show()

应用程序集可放置于应用程序根目录( 开发时为工程目录 ), 或者 “/bin”子目录下
应用程序根目录可在创建应用程序域之前使用 clr.AppDomainSetup.ApplicationBase 自行定义

使用 appDomain.loadFile() 则支持直接自内存载入程序集,当然也可以是一个普通文件。
这样添加工程目录,并设为内嵌资源的程序集,在发布后就不需要再附带外部dll文件了。

4、 调用类的静态方法

//调用类的静态方法
var ret  = appDomain.invokeStaticMember(
“\CSNET2ClassLibrary.dll” //指定程序集,写路径或程序集名都可以
    ,“CSNET2ClassLibrary.CSSimpleObject” //类名称
    ,“GetStringLength” //静态方法名
    ,“HelloWorld” //支持不定个数参数
    );

您可以在快手最新版本中找到上面范例的完整代码:
范例位置:快手范例->dotNet->加载C#程序集
快手最新版本下载:http://www.aau.cn/article-2-1.html

C#类添加下面的代码即可支持com接口
[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDispatch)]

using System.Runtime.InteropServices; 

namespace CSNET2ClassLibrary
{
[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDispatch)]
public 
class CSSimpleObject
{
public CSSimpleObject()
{
 }
}
}

附: Microsoft .NET Framework 4 Client Profile 独立安装程序

下面是自动检测并安装.Net 4.0 Client Profile 的代码:

import dotNet.clr;
iftrue || !(dotNet.clr(“v2.0”) ) || ( dotNet.clr(“v4.0”) ) ){
import win;
import inet.downBox;

if( win.msgboxTest(‘您的系统未安装.Net运行库支持\n继续运行本程序需要下载安装.Net Framework 4.0,\n退出请按取消.’,“运行环境检测”) ){
var downBox = inet.downBox(mainForm,“正在下载 Microsoft .NET Framework 4 Client Profile”)
downBox.endProc = 
function(ret,fileSize,err){
if(!err)
owner.endModal();
}

downBox.download(
“http://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe”
“/download/IE8-WindowsXP-x86-CHS.exe” )

if( downBox.complete ){
process.execute_wait(
“/download/IE8-WindowsXP-x86-CHS.exe”)
}
}
}

已支持运行时编译 C# 语言


import console;
console.open()

import dotNet;
var clr,err = dotNet.clr( “v2.0” );
if( !clr ){
console.log(
“当前系统未安装.Net Framework 2.0”, err )
return;
}

//创建应用程序域
var appDomain = clr.createAppDomain();

//创建C#语言编译器
var compile = appDomain.createCompiler(“C#”);
compile.Reference(
“System.dll”)

//设置待编译C#源码
compile.Source = /******
using System.Reflection;

namespace CSharpLibrary
{
public class AAutoTable
{
private object tObject;
public AAutoTable(object obj){
tObject = obj;
}
public object GetProperty(string k){
return  tObject.GetType().InvokeMember(“属性名”
, 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 ){

AAutoTable tab = new AAutoTable( comObject );

tab.SetProperty( “属性名”,456 ) ;

tab.InvokeMember( “执行AAuto”,  @”
io.print(‘在C#中执行AAuto代码’);
” );

return tab.GetProperty(“属性名”);
}
}
}
******/

//编译并返回程序集
var assembly = compile.Compile()

//调用程序集创建类对象
var cSharpObject = assembly.CreateInstance(“CSharpLibrary.CSharpObject”)

//调用实时编译的C#函数
var ret = cSharpObject.Hello( {
属性名 = 123;
执行AAuto = 
function( code ){
loadcode(code)();
}
} );  

最后编辑:
作者:NINE
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。