[AX]AX2012 使用.NET Interop from X++ 您所在的位置:网站首页 断水流beat [AX]AX2012 使用.NET Interop from X++

[AX]AX2012 使用.NET Interop from X++

2024-05-07 14:40| 来源: 网络整理| 查看: 265

已经讲过可以通过Proxy class从C#使用X++的类,反过来从X++使用CLR的类型当然也是可以的,这在以前版本的AXAPTA 4.0、AX 2009就开始支持了,这里把要注意的问题做一简单的归纳。

X++使用CLR类的静态方法需要使用“::”而不是C#中的“.”,这和X++调用X++类的静态方法是一样的:

System.String netString=System.Convert::ToString("xxx");

从X++的数据类型到CLR的元类型或者从CLR的元类型到X++的数据类型,会自动进行隐式的marshal转化,下表是两者类型的对应关系:

X++ type

CLR type

boolean

System.Boolean

date

System.DateTime

int

System.Int32

int64

System.Int64

str

System.String

guid

System.Guid

Real

System.Single or System.Double

X++的int类型是不会转化成CLR的Int64的,CLR的Int32也是不会转成X++的int64,反过来从64位到32位整数也是一样。X++的real类型同时对应CLR的Single和Double两种,X++的real类型可以直接赋值给CLR的Single类型,在AX2009中也可以直接赋值给Double类型,但是以后的版本中可能会改变,AX2012提供函数Global::real2double(xppReal)将X++的real类型转成CLR的Double类型。

 

X++ timeofday没有对应的CLR元类型,它内部其实使用整数类型来表示数据的。同样X++的utcdatetime也没有对应的CLR类型,AX2012提供Global::utcDateTime2SystemDateTime()和Global::CLRSystemDateTime2UtcDateTime()两个方法来相互转换。AX2012还提供DateTimeUtil::tostr()从utcdatetime转换成字符串,和DateTimeUtil::parse()从字符串转换成utcdatetime,需要注意的是CLR的System.Convert.ToString()或者System.DateTime.ToString()得到字符串是不能直接被DateTimeUtil::parse()解析的,时间字符串的格式要使用ISO的标准24小时格式“yyyy-mm-ddThh:mm:ss”,比如当前的时间应该为“2012-09-11T10:01:05”,实际上这样的格式的时间是可以直接赋值给X++的utcdatetime而不需要DateTimeUtil::parse()做额外的转换,比如:

utcdatetime xppIsoDttm = 2012-09-11T10:01:05;

 

在X++中CLR的值类型实际上是以引用保存的,这意味着除了“=”赋值操作符外,不能使用“==”或者“>”等逻辑运算符来比较两个CLR值类型,也不能使用位操作符“&”及“|”。比如两个System.Int32的变量a和b,这样判断“a>=b”是不正确的,相应的要使用System.Int32.CompareTo()方法。

 

X++可以使用CLR的数组,同样使用“[]”定义一个数组,内部创建System.Array的CLR类型,但是不能使用“[]”访问CLR数组的元素,而要使用GetValue()、SetValue()等方法:

static void JobTestNetArray() { System.Int32[] iNetNumbers; // .NET Framework array int iXppNumbers[2]; // X++ array int iXppNum,iXppArrayLength,i; ; info("Next, .NET Framework array by special X++ syntax."); //-------- .NET Framework array by special X++ syntax ------ iNetNumbers = new System.Int32[2](); // Note the () at end. iNetNumbers.SetValue(100, 0); // Resembles iNetNumbers[0]=100. iNetNumbers.SetValue(101, 1); iXppArrayLength = iNetNumbers.get_Length(); for (i = 0; i < iXppArrayLength; i++) { iXppNum = iNetNumbers.GetValue(i); // Resembles iNetNumbers[i]. info(int2str(iXppNum)); } info("Next, X++ Native array."); //----------- X++ Native array ------ iXppNumbers[1] = 2201; iXppNumbers[2] = 2202; for (i = 1; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有