.NET DLL в PowerBuilder (как COM) проблема со списками - PullRequest
0 голосов
/ 15 декабря 2009

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

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

1 голос
/ 15 декабря 2009

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

...