2009-12-15 4 views
0

Tout, j'essaie d'accéder à un .NET dll enregistré comme un objet COM avec PowerBuilder 10. Je continue à courir dans les problèmes où les objets .NET retournent des listes..NET DLL dans PowerBuilder (COM) problème avec les listes

J'ai construit une classe très simple pour une preuve de concept, et pour mieux expliquer ce que je suis en train de rencontrer. Voir ci-dessous:

.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) 

Pour chaque partie que « NE FONCTIONNE PAS » Je reçois ce message d'erreur:

« Fonction/événement sans valeur de retour utilisée dans l'expression à la ligne "

Évidemment, je pourrais juste enrouler mon assembly .NET, et renvoyer un tableau pour chaque liste, mais j'aimerais pouvoir manipuler des listes sur le côté de PowerBuilder sans encapsuler le .NET. Quelqu'un a-t-il une idée? Le fait que (4) fonctionne et (2) ne fonctionne pas me rend un peu fou.

Merci.

Répondre

1

Cela fait plus de 10 ans que j'ai travaillé avec Powerbuilder, mais je dirais que List<int> ne fonctionnerait pas simplement parce que c'est une liste générique que je ne pense pas être correctement mappée à un tableau COM - cela expliquerait pourquoi 1 et 4 fonctionne mais rien d'autre. Pouvez-vous travailler avec des tableaux simples au lieu de listes génériques?

1

J'avais l'habitude de traiter avec ceci tous les jours en exposant des API .NET riches à COM. COM ne comprend pas les génériques, mais ne laissez pas cela vous ralentir - l'astuce consiste à exposer la liste générique comme un type de base non générique et visible que List<int> expose déjà, comme IList. Changez votre type de retour GetList à IList, recréer/enregistrer, et assurez-vous que Powerbuilder voit votre typelib fixe, et tout devrait bien se passer.