搜索
查看: 16371|回复: 40

dotNet 支持库,可方便的调用.Net 组件

  [复制链接]

7

主题

26

帖子

163

积分

荣誉会员

一鹤

Rank: 8Rank: 8

积分
163
QQ
发表于 2012-10-4 09:23:12 | 显示全部楼层 |阅读模式
aardio 新增 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" //支持不定个数参数
    );

您可以在aardio最新版本中找到上面范例的完整代码:
范例位置:aardio范例->dotNet->加载C#程序集
aardio最新版本下载:http://bbs.aardio.com/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;
if( true || !(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")
        }
    }
}

评分

参与人数 1银币 +1 收起 理由
seakingii + 1 很给力!

查看全部评分

回复

使用道具 举报

7

主题

26

帖子

163

积分

荣誉会员

一鹤

Rank: 8Rank: 8

积分
163
QQ
 楼主| 发表于 2012-10-4 09:42:44 | 显示全部楼层

[align=left][align=left][align=left][font=新宋体][color=#008000] [/color][color=#0


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 aardioTable  
        {
            private object tObject;
            public aardioTable(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 ){   
            
                aardioTable tab = new aardioTable( comObject );
            
                tab.SetProperty( "属性名",456 ) ;
               
                tab.InvokeMember( "执行aardio",  @"
                    io.print('在C#中执行aardio代码');
                " );
               
                return tab.GetProperty("属性名");
            }
        }   
    }
******/


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

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

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

点评

同意: 5.0 真棒: 5.0
继续努力: 5.0
同意: 5 真棒: 5 继续努力: 5
这下牛逼完了  发表于 2012-10-9 18:13
回复

使用道具 举报

20

主题

333

帖子

1980

积分

荣誉会员

Rank: 8Rank: 8

积分
1980
发表于 2012-10-4 10:06:02 | 显示全部楼层

mark 支持。

mark 支持。
回复

使用道具 举报

16

主题

83

帖子

871

积分

三级会员

Rank: 4

积分
871
发表于 2012-10-4 10:51:02 | 显示全部楼层

真厉害,越来越强大了。

真厉害,越来越强大了。
回复

使用道具 举报

0

主题

1

帖子

32

积分

新手入门

Rank: 1

积分
32
发表于 2012-10-4 11:26:48 | 显示全部楼层

太强了 。。正准备把原来的.net 改写成aardio呢。。这下省事了。

太强了 。。正准备把原来的.net 改写成aardio呢。。这下省事了。
回复

使用道具 举报

3

主题

56

帖子

396

积分

二级会员

Rank: 3Rank: 3

积分
396
发表于 2012-10-4 11:37:16 | 显示全部楼层

{:3_59:} 强大的aardio,强大的Jacen!!!


强大的aardio,强大的Jacen!!!
回复

使用道具 举报

25

主题

455

帖子

2459

积分

五级会员

Rank: 8Rank: 8

积分
2459
发表于 2012-10-4 13:29:13 | 显示全部楼层

安逸哈!NET运用太给力了1

安逸哈!NET运用太给力了1
回复

使用道具 举报

92

主题

1503

帖子

8141

积分

荣誉会员

Rank: 8Rank: 8

积分
8141
发表于 2012-10-4 14:33:33 | 显示全部楼层

支持一个,谢谢老大封装

支持一个,谢谢老大封装
回复

使用道具 举报

52

主题

289

帖子

1788

积分

四级会员

Rank: 6Rank: 6

积分
1788
发表于 2012-10-4 14:57:15 | 显示全部楼层

我勒个擦.碉堡了

我勒个擦.碉堡了
回复

使用道具 举报

0

主题

76

帖子

480

积分

二级会员

Rank: 3Rank: 3

积分
480
发表于 2012-10-4 15:27:24 | 显示全部楼层

给力

给力
回复

使用道具 举报

6

主题

62

帖子

445

积分

二级会员

Rank: 3Rank: 3

积分
445
发表于 2012-10-4 16:38:21 | 显示全部楼层

支持aardio 又一个有力的封装

支持aardio 又一个有力的封装
回复

使用道具 举报

37

主题

194

帖子

1289

积分

四级会员

Rank: 6Rank: 6

积分
1289
发表于 2012-10-4 17:55:26 来自手机 | 显示全部楼层

厉害 [size=1][color=#708090]来自:aardio编程论坛 Android客户端[/color][/size]

厉害
来自:aardio编程论坛 Android客户端来自: Android客户端
回复

使用道具 举报

9

主题

209

帖子

1326

积分

四级会员

Rank: 6Rank: 6

积分
1326
发表于 2012-10-4 21:14:09 | 显示全部楼层

祝贺aardio新 的进展

祝贺aardio新 的进展
回复

使用道具 举报

0

主题

16

帖子

139

积分

一级会员

Rank: 2

积分
139
发表于 2012-10-4 23:06:43 | 显示全部楼层

每天点一次更新,每次都会有新的惊喜!{:2_27:}

每天点一次更新,每次都会有新的惊喜!
回复

使用道具 举报

3

主题

44

帖子

392

积分

二级会员

Rank: 3Rank: 3

积分
392
发表于 2012-10-5 08:04:04 | 显示全部楼层

太帅了!!

太帅了!!
回复

使用道具 举报

2

主题

8

帖子

358

积分

二级会员

Rank: 3Rank: 3

积分
358
发表于 2012-10-5 10:04:31 | 显示全部楼层

本人玩c#的,强烈支持。

本人玩c#的,强烈支持。
回复

使用道具 举报

2

主题

50

帖子

870

积分

三级会员

Rank: 4

积分
870
发表于 2012-10-5 13:02:55 | 显示全部楼层

mark一下,假日期间Jacen版主还给大家带来惊喜,很佩服啊!

mark一下,假日期间Jacen版主还给大家带来惊喜,很佩服啊!
回复

使用道具 举报

7

主题

32

帖子

232

积分

二级会员

Rank: 3Rank: 3

积分
232
发表于 2012-10-5 21:10:21 | 显示全部楼层

例子大大的来呀

例子大大的来呀
回复

使用道具 举报

0

主题

1

帖子

8

积分

新手入门

Rank: 1

积分
8
发表于 2012-10-5 23:36:16 | 显示全部楼层

Jacen强大!

Jacen强大!
回复

使用道具 举报

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-22 07:01 , Processed in 0.140625 second(s), 29 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表