2010-04-15 19 views
5

Tükettiğim ve dizi parametrelerinde sorun yaşıyorum bir üçüncü taraf COM kitaplığım var. aşağıdaki gibi aradımCOM kümesiyle C# içindeki dizi parametrelerini kullanma

yöntem imzadır:

int GetItems(ref System.Array theArray) 

dokümantasyon hepsi yöntemin dönüş değeri diziye dolduracaktır öğelerin sayısı, ama olsun en adlandırılan söylüyor Dizideki değerlerin yalnızca, yöntem sıfır olmayan bir döndürme değeri döndürmesine rağmen varsayılan değerlerdir (yapılardır).

Burada devam eden bazı COM etkileşimli şeyler olduğunu biliyorum, ancak gerçekten onunla çok fazla deneyimim yok ve bunu çözemiyorum. Buna erişmeye çalıştığım şey:

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

Neyi yanlış yapıyorum?

GÜNCELLEME: Burada açıklandığı gibi SafeArrays ile ilgili bir şey olabileceğini düşünüyorum: http://www.west-wind.com/Weblog/posts/464427.aspx Fark, yalnızca bir dönüş değeriyle değil, ref ile dizide geçmem gerekiyordu. Bu yazının özel çözümü işe yaramıyor, ama ısınıyormuş gibi hissediyorum.

cevap

0

Herhangi bir Interop yaptığımdan beri bir süredir bu yüzden emin değilim, ama COM kitaplığına göndermek için yönetilmeyen belleği ayırmanız gerektiğini düşünüyorum. Marshal sınıfına, özellikle de Marshal.AllocHGlobal sınıfına bakıyorum (muhtemelen hafızayı serbest bırakmak için FreeHGlobal kullanmalısınız). Bu belki gibi

şey:

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