在C#中使用带有COM互操作的ref Array参数

时间:2010-04-15 23:33:13

标签: c# com interop com-interop

我有一个第三方COM库,我正在消耗,并且我遇到了数组参数问题。

我正在调用的方法签名如下:

int GetItems(ref System.Array theArray)

文档说该方法的返回值是它将填充到数组中的项目数,但是当它被调用时,数组中的所有值都只是默认值(它们是结构体),即使该方法返回非零返回值。

我知道这里有一些时髦的COM互操作,但我真的没有多少经验,也无法弄明白。这就是我试图访问它的方式:

Array items = Array.CreateInstance(typeof(structItem), 100);
int numberOfItems = instance.GetItems(items);

Array items = Array.CreateInstance(typeof(structItem), 100);
int numberOfItems = instance.GetItems(ref items);

structItem[] items = new structItem[100];
int numberOfItems = instance.GetItems(items);

structItem[] items = new structItem[100];
int numberOfItems = instance.GetItems(ref items);

我做错了什么?

更新:我认为它可能与SafeArrays有关,如下所述:http://www.west-wind.com/Weblog/posts/464427.aspx不同之处在于我应该通过ref传递数组,而不仅仅是处理返回值。本文的具体解决方案不起作用,但我觉得我变暖了。

1 个答案:

答案 0 :(得分:0)

我做了任何Interop已经有一段时间了,所以我不确定,但我认为你应该分配非托管内存来发送到COM库。我会查看Marshal类,尤其是Marshal.AllocHGlobal(您可能必须使用FreeHGlobal来释放内存。)

这样的事情可能是:

IntPtr p = Marshal.AlloHGlobal(items.Length * Marshal.SizeOf(typeof(structItem));  
Marshal.Copy(items, 0, p, items.Length);