2010-04-15 111 views
5

我有一個第三方COM庫,我正在使用並且遇到數組參數問題。在C#中使用ref數組參數與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傳遞數組,而不僅僅是處理返回值。本文中的具體解決方案不起作用,但我覺得我變暖了。

回答

0

自從我做了任何Interop之後已經有一段時間了,所以我不確定,但我認爲你應該分配非託管內存來發送到COM庫。我會看看Marshal類,尤其是Marshal.AllocHGlobal(儘管如此,您可能必須使用FreeHGlobal來釋放內存)。

事情是這樣的,也許:

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