.NET dll в PowerBuilder (как COM) проблема со списками

Все, я пытаюсь получить доступ к .NET dll, зарегистрированному как COM-объект с помощью PowerBuilder 10. Я постоянно сталкиваюсь с проблемами, когда объекты .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 и вернуть массив для каждого списка, но я хотел бы иметь возможность обрабатывать списки на стороне PowerBuilder, не оборачивая .NET. У кого-нибудь есть идеи? Тот факт, что (4) работает и (2) не работает, сводит меня с ума.

Спасибо.


person RepDetec    schedule 15.12.2009    source источник


Ответы (2)


Прошло более 10 лет с тех пор, как я работал с Powerbuilder, но я бы сказал, что List<int> не будет работать просто потому, что это общий список, который, как я думаю, не может быть правильно сопоставлен с массивом COM - это объясняет, почему 1 и 4 работает но больше ничего. Можете ли вы работать с простыми массивами вместо общих списков?

person Otávio Décio    schedule 15.12.2009

Раньше я сталкивался с этим каждый день, когда предоставлял COM богатые API .NET. COM не понимает обобщенные типы, но не позволяйте этому замедлять вас - уловка состоит в том, чтобы представить общий список как неуниверсальный, видимый для всех базовый тип, который List<int> уже предоставляет, например IList. Измените тип возвращаемого значения GetList на IList, перестройте / зарегистрируйте и убедитесь, что Powerbuilder видит вашу фиксированную библиотеку типов, и все должно быть в порядке.

person nitzmahone    schedule 17.12.2009