2010-04-15 8 views
5

Ich habe eine COM-Bibliothek von Drittanbietern, die ich konsumiere und habe Probleme mit Array-Parameter.Verwenden von Ref-Array-Parameter in C# mit COM-Interop

Die Signatur der Methode, die ich rufe ist wie folgt:

int GetItems(ref System.Array theArray) 

Die Dokumentation sagt, dass der Rückgabewert der Methode ist die Anzahl der Elemente in das Array füllen, aber wenn es genannt bekommen, alle Die Werte im Array sind nur Standardwerte (sie sind Strukturen), obwohl die Methode einen Rückgabewert ungleich Null zurückgibt.

Ich weiß, es gibt einige funky COM Interop Zeug hier, aber ich habe wirklich nicht viel Erfahrung damit und kann es nicht herausfinden. So habe ich versucht, darauf zuzugreifen:

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

Was mache ich falsch?

UPDATE: Ich denke, es könnte etwas mit SafeArrays zu tun haben, wie hier beschrieben: http://www.west-wind.com/Weblog/posts/464427.aspx Der Unterschied ist, dass ich das Array durch Ref übergeben soll, nicht nur einen Rückgabewert behandeln. Die spezifische Lösung aus diesem Artikel funktioniert nicht, aber ich fühle mich, als ob ich wärmer werde.

Antwort

0

Es ist eine Weile her, seit ich irgendeine Interop gemacht habe, also bin ich mir nicht sicher, aber ich denke, Sie sollten nicht verwalteten Speicher zuweisen, um an die COM-Bibliothek zu senden. Ich würde auf die Marshal Klasse, vor allem Marshal.AllocHGlobal (wahrscheinlich müssen Sie FreeHGlobal verwenden, um den Speicher nach hinten frei).

So etwas wie dieses vielleicht:

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