2010-04-15 4 views
5

के साथ सी # में रेफ ऐरे पैरामीटर का उपयोग करना मेरे पास एक तृतीय पक्ष COM libary है जिसका मैं उपभोग कर रहा हूं और सरणी पैरामीटर के साथ समस्याएं आ रही हैं।COM इंटरऑप

विधि हस्ताक्षर है कि मैं फोन कर रहा हूँ इस प्रकार है:

int GetItems(ref System.Array theArray) 

प्रलेखन का कहना है कि विधि द्वारा दिया गया मान मदों की संख्या यह सरणी में से स्थापित हो जाएगा है, लेकिन जब इसे पाने के कहा जाता है, सब सरणी में मानों में से केवल डिफ़ॉल्ट मान हैं (वे structs हैं) भले ही विधि गैर-शून्य रिटर्न मान देता है।

मुझे पता है कि यहां कुछ फंकी 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); 

मैं क्या गलत कर रहा हूं?

अद्यतन: मुझे लगता है कि इसमें सुरक्षित आर्यों के साथ कुछ करना पड़ सकता है, जैसा कि यहां वर्णित है: http://www.west-wind.com/Weblog/posts/464427.aspx अंतर यह है कि मुझे रेफरी मान को संभालकर, सरणी में सरणी में पास होना चाहिए। इस आलेख का विशिष्ट समाधान काम नहीं करता है, लेकिन मुझे लगता है कि मैं गर्म हो रहा हूं।

उत्तर

0

यह कुछ समय हो गया है क्योंकि मैंने कोई इंटरऑप किया है, इसलिए मुझे यकीन नहीं है, लेकिन मुझे लगता है कि आपको COM लाइब्रेरी को भेजने के लिए अप्रबंधित स्मृति आवंटित करनी चाहिए। मैं Marshal कक्षा, विशेष रूप से Marshal.AllocHGlobal पर देखता हूं (हालांकि आपको शायद स्मृति को मुक्त करने के लिए FreeHGlobal का उपयोग करना होगा)।

इस शायद तरह:

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