namespace dotNet; try{ import ..dotNet.clr; var app = appDomain(); load = app.load; loadFile = app.loadFile; loadAppData = app.loadAppData; createWebService = app.createWebService; createCompiler = app.createCompiler; createArray = app.createArray; createArrayList = app.createArrayList; createNameValueList = app.createNameValueList; mscorlib = app.mscorlib; system = app.system; delegate = app.delegate; wrapObject = app.wrapObject; object = app.object; byte = app.byte; ubyte = app.ubyte; word = app.word; uword = app.uword; int = app.int; uint = app.uint; long = app.long; ulong = app.ulong; float = app.float; double = app.double; buffer = app.buffer; char = app.char; color = app.color; reference = app.reference; each = app.each; dict = app.dict; self.import = app.import; getObject = function(v,unbox){ var obj = v[["_dotNetObject"]]; //如果是可转换的基础类型或 System.Object 数组,可直接使用 Value 属性取值,不必调用此函数。 if( obj && unbox && ..com.IsNetObject(obj)===2) return obj.Value; return obj; } unwrapObject = function(obj){ return obj[["_dotNetObject"]] : obj; } setParent = function(n,f,fill){ if(!n) error("参数 @1 必须指定 .NET 控件对象!",2); if( !( f[["hwnd"]] && f.isForm ) ){ error("参数 @2 必须是 win.form 对象或 custom 控件!",2); } if(!( ..win[["getThreadProcessId"]] && ( ..win.getThreadProcessId(f[["hwnd"]]) == ..thread.getId()) ) ){ error("必须在界面线程中嵌入 .NET 控件!",2); } ..win.modifyStyle(n.Handle,,0x40000000/*_WS_CHILD*/); ..win.setParent(n.Handle,f.hwnd); f._beforeDpiChanged = function(){ var font = f.getFont(); if(!font) font = ::LOGFONT(); font.h = rget(2, f.dpiScale(0,font.h)); var netfont = app.Drawing.Font(font.name, font.getPointSize(,f.hwnd)); n.Font = netfont; } if( f.dpiScale(1) != 1 )f._beforeDpiChanged(); if(fill!==false){ f.onEraseBkgnd = function(){ n.Invalidate(); return 0; } f.isDialogMessage = lambda() false; if(!f.preadjust) f._adjust = function( cx,cy,wParam ) { n.Width = cx; n.Height = cy; }; var rc = f.getClientRect(); ..win.setPos(n.Handle,0,0,rc.width(),rc.height()); n.Show(); } } //.NET 4.5 开始支持异步任务 wait = function(t,winform,...){ if(!winform){ while(..thread.delay(1)){ if(t.IsFaulted){ return null,(t.Exception.Message||"异步任务遇到未知错误!"); } if(t.IsCanceled){ return null,"已取消"; } if(t.IsCompleted){ return t.Result; } } return t.Result; } return winform.wait( function(){ if(t.IsFaulted){ return null,(t.Exception.Message||"异步任务遇到未知错误!"); } if(t.IsCanceled){ return null,"已取消"; } if(t.IsCompleted){ return t.Result; } },...); } self@ = { _call = function(...){ return self.import(...);//@Deprecated } } } catch(e){ class clr{ ctor( version ){ return null,..string.format(".NET runtime %s cannot be loaded,%s",version:"",e:"" ) }; } } //@guide [✨ .NET 交互指南](doc://library-guide/std/dotNet/_.html) [💻 .NET 运行时](doc://library-guide/std/dotNet/clr.html) /**intellisense() dotNet = dotNet 支持库。\n此命名空间下的函数由当前线程默认应用程序域提供。\n> 无参数调用 dotNet.appDomain 构造函数可返回当前线程默认应用程序域。\n导入此库时如果当前是主线程则将应用程序根目录("/")设为当前目录。 end intellisense**/ /**intellisense(dotNet) import( = 加载程序集,导入 .NET 命名空间、类、枚举。\n在当前应用程序域 import,load 等函数不会导入重复的程序集,\n同一程序集中不会重复导入相同的命名空间。 \n\n如果已存在同名的全局命名空间但元表为空(并未导入 .NET 命名空间),\n则导入 .NET 命名空间到已存在的命名空间。\n\n如果已存在同名的全局命名空间但元表非空(通常为已导入的 .NET 命名空间 ),\n则不会覆盖已存在的名字间,而是在返回值返回当前调用实际创建的命名空间。\n加载程序集或依赖程序集失败时此函数会抛出异常。 import(.(命名空间) = 参数 @1 必须用字符串指定要名载的命名空间。\n首先加载与命名空间同名的程序集,然后导入同名的 .NET 命名空间或类。\n当程序集文件名与导入名字相同时,参数 @2 不必指定程序集名称。\n\n返回命名空间可作为类构造函数调用并创建对象。\n也可以用成员操作符获取静态成员,或调用静态函数。\n\n导入的 .NET 命名空间在正常访问其成员时会触发元方法以获取并创建下级命名空间、类、枚举等。\n但导入命名空间的函数(以及 namespace 语句)创建的上级命名空间并不会主动导入同名 .NET 命名空间\。\n\n此函数会尽可能重用已存在的 aardio 全局命名空间导入 .NET 命名空间。\n如果该全局命名空间已导入其他 .NET 命名空间则不会覆盖已存在的名空间。\n此函数总是会返回当前调用实际创建的命名空间。 import(.(命名空间,程序集名) = 加载参数 @2 指定文件名字的程序集。\n将参数 @1 指定的空间、类、枚举等导入 aardio 全局命名空间。\n必须指定完整命名空间。\n参数 @1 可指定命名空间也可以指定要导入的命名空间数组。\n\n在当前应用程序域 import,load 等函数不会导入重复的程序集,\n同一程序集中不会重复导入相同的命名空间。 \n\n返回命名空间可作为类构造函数调用并创建对象。\n也可以用成员操作符返回静态成员,或调用静态函数。\n\n导入的 .NET 命名空间在正常访问其成员时会触发元方法以获取并创建下级命名空间、类、枚举等。\n但导入命名空间的函数(以及 namespace 语句)创建的上级命名空间并不会主动导入同名 .NET 命名空间。\n\n此函数会尽可能重用已存在的 aardio 全局命名空间导入 .NET 命名空间。\n如果该全局命名空间已导入其他 .NET 命名空间则不会覆盖已存在的名空间。\n此函数总是会返回当前调用实际创建的命名空间。 load( = 使用当前线程默认应用程序域载入并返回程序集(DLL)。\n在当前应用程序域如果已使用此函数导入同名程序集,\n则直接返回该程序集 load(.("程序集名") = 使用当前线程默认应用程序域载入并返回程序集。\n参数可以是程序集(DLL)名称或路径。\n\n此函数会按以下顺序调用 .NET 函数尝试加载程序集:\n└── Assembly.LoadWithPartialName\n└── Assembly.Load\n└── Assembly.LoadFrom\n└── Assembly.LoadFile load(.("程序集名",虚拟程序集数据或路径) = 首先在『虚拟程序集引用表』中注册程序集名,\n参数 @2 指定对应的内存 DLL 数据或 DLL 路径(支持 EXE 内嵌资源)。\n然后再调用 load 函数加载并返回该虚拟程序集。\n\n注意参数 @1 指定的是程序集的文件名,不是写导入的命名空间。\n调用返回程序集对象的 import 成员函数再导入命名空间 loadFile( = 使用当前线程默认应用程序域载入程序集(DLL)。\n参数可以是 DLL 路径,内存 DLL,或 EXE 内嵌资源。\n此函数并不支持 『虚拟程序集引用表』,无法在内存添加依赖 DLL\n程序集如果引用了自身路径必须改用 load 函数加载 loadFile(.("程序集路径") = 使用当前线程默认应用程序域载入程序集,\n参数可以是 DLL 路径,内存 DLL,或 EXE 内嵌资源。\n\n在路径字符串前加$符号可将文件编译并嵌入 aardio 代码,\n可选在第 2 个参数中指定 pdb 调试数据或 pdb 调试文件路径。\n可用 com.dte 对象提供的 AttachProcesses 自动附加到 VS 开发环境调试进程。 load() = !dotNetCrlAssembly. loadFile() = !dotNetCrlAssembly. loadAppData( = 可用于嵌入并自 %appData% 目录加载\n不支持通过 loadFile 函数内存加载的程序集 loadAppData(.(path,data) = 用 @path 指定 %appData% 目录下的相对路径,\n将 @data 参数指定的内存程序集数据释放到该路径,\n并使用 load 函数加载此程序集,\n@data 参数应在路径前加$符号使文件数据嵌入到代码中 loadAppData() = !dotNetCrlAssembly. createWebService( = 使用当前线程默认应用程序域创建Web服务程序集 createWebService(.(服务网址,命名空间,协议名,DLL路径) = 使用当前线程默认应用程序域创建 Web 服务程序集,\n可选在参数@2中指定一个自定义的命名空间\n协议名默认为"Soap",可选值"Soap12",\n如果使用参数@4指定输出DLL路径则在内存中编译程序集 createWebService() = !dotNetCrlAssembly. createCompiler("C#") = 使用当前线程默认应用程序域创建C#编译器 createCompiler("VB") = 使用当前线程默认应用程序域创建VB编译器 createCompiler() = !dotNetCompiler. createArray( = 创建 .NET 类型化数组。\n.NET 通常要求数组类型完全匹配,可以用这个函数创建类型匹配的数组。\n\n包含.NET 对象的普通 aardio 数组在传入 .NET 时也会临时转换为类型化数组\n默认的普通数值数组传入 .NET 为 double 数组,但支持自适应转换类型。\n也可以用 dotNet.double,dotNet.int 等函数创建类型化数值数组。\n\n注意 .NET 数组对象应当用 Length 属性取数组长度而非用 #号取长度,\n.NET 中的简单值类型数组在 aardio 中会转换为 com.SafeArray 数组,\ncom.SafeArray 数组可以用 # 取长度 createArray(.(类型,长度->->->) = 参数 @1 请指定 .NET 类型,\n类型通常由 dotNet.import 导入,或用 .NET 对象的 GetType 函数获取。\n至少指定一个数组长度参数,可指定多个长度参数以创建多维数组 createArray(.(数组) = 参数 @1 请指定数组。\n包含.NET 对象的普通数组返回为 .NET 类型化数组,\n传入其他任何类型参数直接返回 createArrayList(.(初始化数组) = 创建 System.Collections.ArrayList 对象\n可传递到C#函数中,C#中应声明为 object 类型,然后强制转换为 ArrayList,\n可选参数一指定 table 数组用于初始化对象 createArrayList() = !dotNetCrlArrayList. createNameValueList(.(names,values) = 创建 List> 列表对象,\n参数@name,@value 必须是长度相等的非空数组,\n返回 List 对象的每个元素都具有 Name,Value 属性,\n其值由 @names,@values 参数按数组索引顺序分配 delegate = 用于操作 .NET 委托(Delegate)或事件(event),\n在 .NET 里函数要转换为委托对象才能作为回调函数传输,\n在 aardio 里对所有 .NET 对象的委托字段直接赋值总是覆盖而不是追加,\n对所有 .NET 事件赋值时总是追加而不是覆盖,\n!dotNetDelegate. reference( = 在『虚拟程序集引用表』注册一个或多个虚拟程序集,\n这些虚拟程序集可以是内存程序集、本地程序集、EXE 内嵌资源中的程序集。\n\naardio 加载的 .NET 程序找不到程序集(DLL)时,\n会查找『虚拟程序集引用表』并加载已注册的虚拟 DLL。\n\n同时复制多个 DLL 路径的方法:\n在资源管理器多选 DLL 文件,按住 Shift 点右键菜单项『复制为路径』 reference(.(simpleAssemblyName,pathOrData) = 在『虚拟程序集引用表』注册虚拟程序集(DLL)。\n@simpleAssemblyName 指定程序集短名称(虚拟 DLL 文件名)\n@pathOrData 指定程序集路径或内存数据,支持内嵌资源路径\n@pathOrData 也可以是返回程序集路径或数据的回调函数 reference(.(assemblyName2pathOrData) = 在『虚拟程序集引用表』注册多个虚拟程序集(DLL)。\n@assemblyName2pathOrData 指定一个表:\n表的「键」为虚拟程序集短名称( DLL 文件名 ),\n\n键对应的「值」指定程序集内存数据或程序集路径(支持内嵌资源)。\n\n同时复制多个 DLL 路径的方法:\n在资源管理器多选 DLL 文件,按住 Shift 点右键菜单项『复制为路径』 setParent( = 嵌入 .NET 窗口到 aardio 窗口,作用类似 win.setParent 函数。\n此函数必须在导入 win.ui 的界面线程中使用。\n\n嵌入 .NET 控件而不是窗口对象,\n请改用 System.Windows.Forms.CreateEmbed 函数 setParent(.(netForm,aarForm) = 嵌入 .NET 窗口到 aardio 窗口,并完全覆盖 aardio 窗口。\n@netForm 参数指定 System.Windows.Forms.Form 对象,不能是控件,\n@aarForm 参数指定 aardio 中的窗体对象或 custom 控件对象,\n\n此函数设置 aarForm 为 netForm 的父窗口,\n并禁止 aarForm 窗口绘制窗口背景,\n控件自动填满 aarForm 内部并自适应窗口缩放\n\n也可在 win.ui.ctrl 命名空间下创建自定义控件 setParent(.(netForm,aarForm,false) = 仅嵌入 .NET 窗口到 aardio 窗口。\n不覆盖 aardio 窗口,不自动设置窗口位置,用于创建自定义控件。\n@netForm 参数指定 System.Windows.Forms.Form 对象,不能是控件,\n@aarForm 参数指定 aardio 中的窗体对象或 custom 控件对象,\n\n此函数设置 aarForm 为 netForm 的父窗口,\n并禁止 aarForm 窗口绘制窗口背景,\n控件自动填满 aarForm 内部并自适应窗口缩放\n\n也可在 win.ui.ctrl 命名空间下创建自定义控件 wrapObject(__) = 如参数是原生 com.NetObject 对象,则返回 dotNet.object 对象,否则直接返回参数。\n\n所有 .NET 原生对象已经自动转换为 dotNet.object 对象,\n除非 .NET 调用普通 aardio 对象的成员函数而非回调特定的委托或事件函数。\n这时候回调参数中的 .NET 对象需要用此函数转换,但数值和字符串不需要转换。\n\n参数传入 com.IsNetObject 函数会返回非 0 值即为原生 com.NetObject 对象,\n非原生 com.NetObject 对象转换为 dotNet.object 应当直接调用 dotNet.object 函数。 unwrapObject(__) = 如果对象是 dotNet.object 对象\n返回被封装的原生 com.NetObject 对象,\n否则直接返回参数\nn\n原生 com.NetObject 对象传入 com.IsNetObject 函数应返回非 0 值 getObject(__) = 如果对象是 dotNet.object 对象,\n返回被 dotNet.object 封装的原生 .NET 对象(在 aardio 中存为 com.NetObject 对象 )。\n原生 com.NetObject 对象传入 com.IsNetObject 函数将返回非 0 值。\n\n如果参数 @2 为 true,并且封包的 .NET 对象是一个 DispatchableObject 代理对象,\n则通过 DispatchableObject 对象的 Value 字段获取真实的值或 .NET 对象。\n如果 DispatchableObject 对象实际存储的是可转换的基础类型或 System.Object 数组,\n可直接使用 dotNet.object 对象的 Value 属性取值,不必调用此函数。\n\n传入其他类型对象或原生 com.NetObject 对象会返回 null。 object( = 转换参数 @1 指定的 aardio 值或数组为 .NET 原生 DispatchableObject 对象,\n并返回为 aardio 可操作的 dotNet.object 对象。\n\n也可用于转换 原生 .NET 对象为 dotNet.object ,\n或转换 dotNet.object 为支持引用 dotNet.object。\n\ndotNet.object 如果存储的是 Primitive,enum,string 类型或这些类型的数组,\n则可以使用 Value 属性读写值。\n\ndotnet.object 对象支持用 tostring 转换为字符串,\n如果存储的是数值则支持调用 tonumber 函数转为普通数值。 object(.(value,byRef) = 参数 @byRef 为 true 则支持 .NET 的输出或引用参数\n\n参数 @value 如果指定纯 aardio 对象或数组。\n则转换为 .NET 原生 DispatchableObject 对象,并封装为 dotNet.object 后返回。\n\n如果参数 @1 指定 dotNet.object 对象且参数 @2 不为 true 则直接返回。\n如果参数传入原生 .NET 对象且参数 @2 不为 true 则仅转换为 dotNet.object。\n如果参数 @2 为 true,则这些对象都会转换为 DispatchableObject 并返回新的 dotNet.object object() = !dotNetObject. byte( = 创建 .NET System.SByte 类型数值或数组 byte(.(value,byRef) = 创建 .NET System.SByte 类型数值或数组,\n用于存储8位整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 ubyte( = 创建 .NET System.Byte 类型数值或数组 ubyte(.(value,byRef) = 创建 .NET System.Byte 类型数值或数组,\n用于存储8位无符号整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 word( = 创建 .NET System.Int16 类型数值或数组 word(.(value,byRef) = 创建 .NET System.Int16 类型数值或数组,\n用于存储16位整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 uword( = 创建 .NET System.UInt16 类型数值或数组 uword(.(value,byRef) = 创建 .NET System.UInt16 类型数值或数组,\n用于存储16位无符号整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 int( = 创建 .NET System.Int32 类型数值或数组 int(.(value,byRef) = 创建 .NET System.Int32 类型数值或数组,\n用于存储32位整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数,\n\n注意普通数值传入 .NET 函数时,\n整数默认转为32位整数,小数默认按double类型处理 uint( = 创建 .NET System.UInt32 类型数值或数组 uint(.(value,byRef) = 创建 .NET System.UInt32 类型数值或数组,\n用于存储32位无符号整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 long( = 创建 .NET System.Int64 类型数值或数组 long(.(value,byRef) = 创建 .NET System.Int64 类型数值或数组,\n用于存储64位整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 ulong( = 创建 .NET System.UInt64 类型数值或数组 ulong(.(value,byRef) = 创建 .NET System.UInt64 类型数值或数组,\n用于存储64位无符号整数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 float( = 创建 .NET System.Single 类型数值或数组 float(.(value,byRef) = 创建 .NET System.Single 类型数值或数组,\n用于存储32位浮点数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数 double( = 创建 .NET System.Double 类型数值或数组 double(.(value,byRef) = 创建 .NET System.Double 类型数值或数组,\n用于存储64位浮点数。\n\n参数 @value 可以为数值或数组,\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数,\n\n注意普通数值传入 .NET 函数时,\n整数默认转为32位整数,小数默认按double类型处理 buffer( = 调用 raw.buffer 分配可读写的、固定长度的字节串(buffer 类型)\n并返回封包 buffer 的 dotNet.object 对象。\n返回对象可用下标操作符 `[]` 读写 8 位无符号字节数值。\n可用 Value 属性获取 buffer 对象,用法请参考 raw.buffer 文档。\n可用 Length 属性获取数组长度。\n\n在 .NET 中对应类型为 `byte[]` 字节数组。\n 可作为 .NET 引用、输出参数使用。 buffer(.(初始值) = 创建缓冲区,参数用法与 raw.buffer 相同。\n参数 @1 可以指定一个结构体、字符串、或 buffer,传入空表 `{}` 返回 null,\n此函数将重新分配内存并复制 参数 @1 指定的初始值数据。 buffer(.(长度,初始值) = 创建缓冲区,参数用法与 raw.buffer 相同。\n\n参数一指定需要分配的内存大小,\n\n参数 @2 可以用结构体、指针、buffer 或字符串之一指定一段内存数据作为初始值,\n也可用一个数值指定填充到所有字节的初始值,不指定默认初始化所有字节为 0 ,\n如果初始值指定为字符串或 buffer 类型,\n填充初始数据以后多余的字节丢弃,不足的部分会填充字节码为 0, char( = 创建 .NET System.Char 类型数值或数组 char(.(value,byRef) = 创建 .NET System.Char 类型数值或数组,\n用于存储 16 位无符号整数。\n\n参数 @value 可以指定数值、字符串或数值数组。\n数组参数必须是普通的 aardio 数值数组(double 类型)或 16 位无符号整型 COM 数组。\n参数 @byRef 为 true 则支持 .NET 的输出或引用参数\n\n.NET 的 char 类型数组在 aardio 中将转换为 16 位无符号整型 COM 数组(SafeArray)。\n显式调用 dotNet.char 创建 .NET 对象可避免被自动转换为 COM 数组。 color(.(value,byRef) = 创建 .NET System.Drawing.Color 类型数值或数组。\n.NET 的 System.Drawing.Color 类型在 aardio 中会自动转换为数值,\n显式调用 dotNet.color 创建 .NET 对象可避免被自动转换。 buffer() = !dotNetObject. byte() = !dotNetObject. ubyte() = !dotNetObject. word() = !dotNetObject. uword() = !dotNetObject. int() = !dotNetObject. uint() = !dotNetObject. long() = !dotNetObject. ulong() = !dotNetObject. float() = !dotNetObject. double() = !dotNetObject. each(netObj) = @for i,v in ??.each(__/*输入需要遍历的 .NET 对象或普通数组,\n返回值 i 为当前索引,v 为当前值,\n注意并非所有 .NET 类型都支持此接口。\n所有 .NET 对象都提供 each 方法,其作用等效于将该对象作为参数调用 dotNet.each 以创建迭代器。*/) { } wait( = 等待 .NET 异步任务执行完成。\n如果任务执行成功返回异步任务的 Result 属性,\n出错返回 null,错误信息,取消返回 null,空字符串 。\n[范例](doc://example/Languages/dotNet/Generic.html) wait(.(task,winform,->->->) = 参数 @1 指定异步函数返回的 System.Threading.Tasks.Task 对象。\n参数 @2 指定 win.form 对象,其他可选参数传给 winform.wait 函数。\n如果参数 @2 为 null (未指定值)则循环等待(不卡界面),忽略其他参数。 \n成功返回异步任务的 Result 属性(异步函数返回值)。失败返回 null,错误信息;取消返回 null,空字符串。\n\n异步任务的 Result 属性可取返回值,Exception.Message 属性可取错误信息。\n也可以用异步任务的 ContinueWith 方法指定异步回调函数,在任务完成后触发。 dict( = 将非空表转换为 .NET 字典。\n如果要创建空字典,调用返回对象的 Clear 函数清空即可。\n返回对象支持用下标操作符访问键值对。\n可用 dotNet.each 遍历字典。 dict(.(tab,byRef) = 将非空表转换为 .NET 字典(Dictionary)对象。\n\n如果传入空表或 null 返回 null 值。\n否则必须传入非空表,表中所有的键必须是相同类型。\n表中所有的值必须是相同类型。\n\n参数 @byRef 为可选参数,如果 @byRef 为 true,\n则返回对象可作为 .NET 输出与引用参数使用 dict() = !stdDotNetDictionary. end intellisense**/ /**intellisense(!dotNetCrlAssembly) Location = 获取完整路径 FullName = 获取程序集的全名 import("__") = 参数 @1 指定要导入 .NET 命名空间、类、枚举,\n与程序集名称相同的命名空间前缀可省略。\n不传入参数则默认指定参数为程序集名称。\n\n在当前应用程序域 import,load 等函数不会导入重复的程序集,\n同一程序集中不会重复导入相同的命名空间。 \n\n返回命名空间可作为类构造函数调用并创建对象。\n也可以用成员操作符返回静态成员,或调用静态函数。\n\n导入的 .NET 命名空间在正常访问其成员时会触发元方法以获取并创建下级命名空间、类、枚举等。\n但导入命名空间的函数(以及 namespace 语句)创建的上级命名空间并不会主动导入同名 .NET 命名空间\。\n\n此函数会尽可能重用已存在的 aardio 全局命名空间导入 .NET 命名空间。\n如果该全局命名空间已导入其他 .NET 命名空间则不会覆盖已存在的名空间。\n此函数总是会返回当前调用实际创建的命名空间 new(.("类名",->->-> ) = 创建对象实例,\n可添加不定个数构造参数\n失败返回空值,以及错误信息 invokeStaticMember(.("类名->方法名",->->-> ) = 调用类的静态方法,\n可添加不定个数调用参数\n失败返回空值,以及错误信息 invokeMember(.("类名->方法名",BindingFlags) = 调用类的方法,\n可添加不定个数调用参数\n失败返回空值,以及错误信息 getStaticMember(.("类名->字段名") = 获取字段或属性值、或枚举值 end intellisense**/ /*****intellisense() !dotNetObject.byRef(true) = 如果 dotNet.object 对象存储的是 DispatchableObject 。\n则可调用此函数修改传参方式,参数用布尔值指定是否支持参数传址(作为引用或输出参数)。\n如果不指定参数则获取一个表示是否支持参数传址的值。\n指定参数 @1 则返回对象自身。\n\n.NET 返回的 aardio 无法直接使用的对象会自动封包为 DispatchableObject 。\n调用 dotNet.object 也可以创建 DispatchableObject。 !dotNetObject.Value = 如果 dotNet.object 对象封包的是 .NET 代理对象(DispatchableObject),\n并且实际存储的是 aardio 可自动转换的基础 .NET 类型数据或者 System.Object 数组,\n则在 aardio 中可以使用 Value 属性读写 DispatchableObject 真实存储的值。\n\n> 可自动转换的类型支持 .NET 中的 Primitive,enum,string 类型或这些类型的数组,\n\n注意 DispatchableObject 的 Value 属性的作用主要是将 .NET 值转换为 aardio 值,\n不要取 Value 属性又传回给 .NET 函数,这会导致不必要地重复来回转换。\n应当直接传 dotNet.object 对象自身给 .NET 函数。 !dotNetObject.Length = 如果 dotNet.object 对象存储的是数组,可用些属性获取数组长度。\n并可以用数值下标读写指定索引的值 !dotNetObject.each() = @for i,v in ??.each() { __/*遍历 .NET 集合对象,i 为迭代序号,v 为迭代值。\n不是所有 .NET 对象都支持此迭代接口。*/ } end intellisense*****/