调用一个.net对象
在vs中,我们看到MessageBox这个类的完全体
在mxs中,使用dotNetClass可以访问一个实例类、静态类、枚举、结构体...他关联的是类型的静态成员
使用dotNetObject可以new一个实例对象
mb = dotNetClass "System.Windows.Forms.MessageBox"
使用mxs的方式调用函数
mb.Show "你好max"
"你好max" 是一个mxs内的字符串,他可以与 public static DialogResult Show(string text); 中参数的string类型通用
在maxscript与.net的交互中,普通的基础类型可以直接传递,至少大部分情况下是通用的
也可以直接传递 .net string 对象作为参数
netString = dotNetObject "System.String" "你好max.net"
mb.Show netString
创建一个.net对象
在c#中string的创建形式为
上面是使用关键字的方法创建,看起来很美好,但并不便于转换理解
我们可以把它变成原始的方式
在mxs中就是这样
netString = dotNetObject "System.String" "你好"
在创建一个比较好理解的类型
至于在mxs里为啥不能直接使用无构造函数的方式,不得而知
创建一个数组
mxsArr = #(1,2,3,4)
Int32Type = dotNetClass "System.Int32[]"
Int32Array = dotnet.ValueToDotNetObject Arr Int32Type
ValueToDotNetObject 可以将mxs的数据类型转换到.net的数据类型
https://trykle.gitee.io/3dsmax-2020.1-maxscript-help/?query=dotNet.ValueToDotNetObject#!/url=./files/GUID-FB52FDC5-CC83-46FB-A430-B90E7107805A.htm
如果你是用的泛型List<>,那么他应该与下方的泛型创建方法雷同
创建一个泛型
c#里字典的创建形式
在mxs里长这样
老实说,我并不知道这样写的规则出处在哪
但我通过ILSPY能看到一些类似的语法
`后面的数字表示泛型参数
string int 换成具体的类型
<>换成[]
创建一个可空int
编译之后在ILSPY中切到c#的远古版本,他长这样
IL中他长这样
结合上面的泛型规则,他在mxs里长这样
再来看一个调用方法的例子
第一步先找到这个方法
GetFolderPath = (dotNetClass "System.Environment").GetFolderPath
第二步创建参数,参数是个枚举类型
在此翻车了,我们无法找到这个类型
我们来验证一下枚举类型的创建方法,找到一个其他的枚举类型
说明这样是没有错的
转到IL中,他们分别变成了这样,System.Environment后面变成了/
把/变成+,正常列出 (至于为什么要把/变成+,不得而知)
最后调用方法
最后关于不得而知的类型创建字符串
这与c#的反射创建类型是一致的
https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.createinstance?view=net-5.0
通过GetType可以获取到完整名字