【问题标题】:How to marshal C# List with X++ List in MS Dynamics AX 2012如何在 MS Dynamics AX 2012 中使用 X++ 列表编组 C# 列表
【发布时间】:2012-06-05 13:06:38
【问题描述】:

我有一个 MS Dynamics AX 2012 项目,我正在使用 .Net 互操作。 static class 中有一个 C# 方法,名为 Database

 public static List<String> GetAllDatabases(string dataSource)

引用这个程序集后,我可以在X++中执行:

ADOMD.ADOMD.Model.Database::GetAllDatabases();

但我无法读取它返回的字符串列表。 我想使用类似的东西:

List databaNameCollection = new List( Types::String ); 
;

databaNameCollection =  ADOMD.ADOMD.Model.Database::GetAllDatabases();

但它会引发错误:

Error executing code:  (object) has no valid runable code in method 'GetSID'.

我该怎么做?

-------已编辑------

我找到了这篇文章:

http://blogs.msdn.com/b/x/archive/2010/01/19/traversing-elements-in-an-ienumerable-from-x.aspx

但那是在 2010 年,可能是 AX 2009,我试图分配:

ClrObject enumerator; 
str theValue;
;

enumerator = ADOMD.ADOMD.Model.Database::GetAllDatabases();
while (enumerator.MoveNext()) 
    { 
        theValue = enumerator.get_Current(); 
        print theValue; 
    } 

GetallDatabases 方法正在与另一个 .Net 项目一起使用,它返回 10 个对象,但在 X++ 代码中,没有返回任何内容。

谢谢

【问题讨论】:

    标签: c# interop axapta x++ dynamics-ax-2012


    【解决方案1】:

    回答您关于 X++ 和 get_{x}set_{x} 中的 .NET 类型的问题:

    .NET 属性在 X++ 中显示为方法。比如C#下面的get & set属性

    string Name {get;set;}
    

    将在 X++ 中显示为

    string get_Name();
    void set_Name(str value);
    

    基本上,C# 属性只是语法糖。 C# 编译器将为每个 get 属性创建一个 get_{x} 方法,并为每个 set 属性创建一个 set_{x}。

    在您的情况下,如果您想访问 cubeDef 对象中的 Name 属性,您必须在 X++ 中编写类似这样的内容:

    info(cubeDef.get_Name());
    

    【讨论】:

      【解决方案2】:

      我使用以下示例制作它:http://blogs.msdn.com/b/x/archive/2010/01/19/traversing-elements-in-an-ienumerable-from-x.aspx

      但是没有enumerator.MoveNext(),因为它不是X++ 对象,将其更改为for 循环有效,最终代码为:

      ClrObject enumerator;  
      str theValue;
      int i;
      int length = 0; 
      List databaNameCollection = new List( Types::String );
      ;  
      
      try
        { 
          permission = new InteropPermission(InteropKind::CLRInterop);
          if (permission == null)
          {
                  return;
          }
          permission.assert();
          enumerator = ADOMD.ADOMD.Model.Database::GetAllDatabases();
          length = enumerator.get_Count();
      
          for (i = 0; i < length; i++)
          {
              stringElement = enumerator.get_Item(i);
              databaNameCollection.addStart(stringElement);
          }
           CodeAccessPermission::revertAssert();
       }
       catch (Exception::CLRError)
       {
           CodeAccessPermission::revertAssert();
           info(CLRInterop::getLastException().ToString());
       }
      

      但仍有一些问题

      1) 我不能直接分配databaNameCollection.addStart(enumerator.get_Item(i));

      2) 我无法访问复杂对象的属性,例如:

      cubeDef  = enumerator.get_Item(i);
      info(cubeDef.Name);
      

      其中cubeDef 的类型为:Microsoft.AnalysisServices.AdomdClient.CubeDef

      3) 我找不到描述这些get_{propertyName} 方法的CLRObject 的文档。 例如:get_Item

      最好的问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多