PowerBuilder中的.NET dll(作为COM)列表中的问题

时间:2009-12-15 02:50:05

标签: .net com powerbuilder

所有,我试图访问一个使用PowerBuilder 10注册为COM对象的.NET DLL。我一直遇到.NET对象返回列表的问题。

我已经建立了一个非常简单的类来进行概念验证,并更好地解释我遇到的问题。见下文:

.NET:

public class ListsArrays
{
    public int[] GetArray()
    {
        int[] array = new int[3];
        array[0] = 1;
        array[1] = 10;
        array[2] = 100;

        return array;
    }

    public List<int> GetList()
    {
        List<int> list = new List<int>();
        list.Add(3);
        list.Add(33);
        list.Add(333);
        return list;
    }

    public int[] GetListArray()
    {
        List<int> list = new List<int>();
        list.Add(3);
        list.Add(33);
        list.Add(333);
        return list.ToArray();
    }
}

的PowerBuilder:

Integer ls_array[]
Integer obj_return, ID, netVal
String FullName
OleObject lo_dotnetobject
OleObject lo_Value

lo_Value = Create OleObject
lo_dotnetobject = Create OleObject

obj_return = lo_dotnetobject.ConnectToNewObject("XXX.ListsArrays")

//This is the tricky part
ls_array = lo_dotnetobject.GetArray()         // WORKS          (1)
ls_array = lo_dotnetobject.GetList().ToArray()  // DOES NOT WORK  (2)
lo_dotnetobject.GetList().CopyTo(ls_array)    // DOES NOT WORK  (3)
ls_array = lo_dotnetobject.GetListArray()      // WORKS          (4)

对于“不工作”的每个部分,我收到以下错误消息:

“在行”

的表达式中使用没有返回值的函数/事件

显然,我可以包装我的.NET程序集,并为每个列表返回一个数组,但我希望能够在不包装.NET的情况下处理PowerBuilder端的列表。有没有人有任何想法? (4)工作和(2)不起作用的事实驱使我疯狂。

感谢。

2 个答案:

答案 0 :(得分:1)

自从我使用Powerbuilder以来已经超过10年了,但我会说List<int>不能正常工作,因为它是一个我认为无法正确映射到COM数组的通用列表 - 这可以解释为什么1和4有效,但没有别的。您可以使用简单数组而不是通用列表吗?

答案 1 :(得分:1)

我每天都会在向COM公开丰富的.NET API时处理这个问题。 COM不理解泛型,但不要让你慢下来 - 诀窍是将通用列表公开为List<int>已暴露的非泛型,com-visible基类型,如IList。将您的GetList返回类型更改为IList,重建/注册,并确保Powerbuilder看到您的固定类型库,并且一切都应该正常。