2009-11-09 15 views
11

के साथ संरचना को मार्शल करते समय मैं किसी क्षेत्र को अनदेखा कर सकता हूं, मैं पी/इनवॉक के साथ उपयोग के लिए संरचना को मार्शल करना चाहता हूं, लेकिन इस संरचना में एक ऐसा फ़ील्ड है जो मेरे प्रबंधित कोड के लिए केवल प्रासंगिक है, इसलिए मैं नहीं इसे मार्शल किया जाना चाहिए क्योंकि यह मूल संरचना में नहीं है। क्या यह भी संभव है? मैं एक विशेषता क्रमबद्धता के लिए NonSerialized के लिए इसी तरह की तलाश में गया था, लेकिन यह अस्तित्व में नहीं लगता है ...पी/Invoke

struct MyStructure 
{ 
    int foo; 
    int bar; 

    [NotMarshaled] // This attribute doesn't exist, but that's the kind of thing I'm looking for... 
    int ignored; 
} 

कोई भी सुझाव

उत्तर

6

वहाँ CLR एक क्षेत्र की अनदेखी करने के लिए कोई रास्ता नहीं है की सराहना की जाएगी। मैं इसके बजाय दो संरचनाओं का उपयोग करूंगा, और शायद एक दूसरे के सदस्य बनूंगा।

struct MyNativeStructure 
{ 
    public int foo; 
    public int bar; 
} 

struct MyStructure 
{ 
    public MyNativeStruct native; 
    public int ignored; 
} 
+0

"CLR एक क्षेत्र की अनदेखी करने के लिए कोई तरीका नहीं है": के मामले में किसी को एक और है हाँ, आप कर रहे हैं शायद सही ... मैं कुछ दिनों के इंतजार करेंगे विचार, लेकिन शायद यह सबसे अच्छा जवाब है जो मुझे मिलेगा। धन्यवाद ! –

1

दो तरीके:

  1. एक struct के बजाय एक वर्ग का उपयोग करें: संरचनाओं हमेशा Windows API या अन्य देशी कार्यों के लिए सूचक द्वारा पारित कर रहे हैं। पर कॉल के साथ doThis(ref myStruct) पर कॉल को प्रतिस्थापित करना चाल चलाना चाहिए। एक बार ऐसा करने के बाद, आप आसानी से विधियों के साथ अपने नॉन-टू-मार्शल फ़ील्ड तक पहुंच सकते हैं।

  2. जैसा कि मैंने पहले ही कहा है, structs हमेशा संदर्भ द्वारा पारित होते हैं: इसलिए कैली संरचना आयामों के बारे में कुछ भी नहीं जानता: केवल अपने अतिरिक्त फ़ील्ड को आखिरी वाले होने के बारे में क्या कहना है? एक मूल कार्य को कॉल करते समय आपको अपनी संरचना के सूचक और संरचना के आकार की आवश्यकता होती है, बस इसके आकार के बारे में झूठ बोलते हैं, जिससे वह आपके अतिरिक्त फ़ील्ड के बिना होता है। मुझे नहीं पता कि यह मूल संरचना से प्राप्त करते समय इस तरह की संरचना को पीछे छोड़ने का कानूनी तरीका है या नहीं। साइड प्रश्न: क्या मार्शलर प्रक्रिया वर्ग फ़ील्ड निजी के रूप में चिह्नित है? (मुझे उम्मीद नहीं ...)

+2

निजी क्षेत्र भी मार्शल हैं –