所有,我试图访问一个使用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)不起作用的事实驱使我疯狂。
感谢。
答案 0 :(得分:1)
自从我使用Powerbuilder以来已经超过10年了,但我会说List<int>
不能正常工作,因为它是一个我认为无法正确映射到COM数组的通用列表 - 这可以解释为什么1和4有效,但没有别的。您可以使用简单数组而不是通用列表吗?
答案 1 :(得分:1)
我每天都会在向COM公开丰富的.NET API时处理这个问题。 COM不理解泛型,但不要让你慢下来 - 诀窍是将通用列表公开为List<int>
已暴露的非泛型,com-visible基类型,如IList。将您的GetList返回类型更改为IList,重建/注册,并确保Powerbuilder看到您的固定类型库,并且一切都应该正常。