2010-09-02 9 views
9

मेरा आंत प्रतिक्रिया नहीं है, क्योंकि प्रबंधित और अप्रबंधित स्मृति अलग हैं, लेकिन मुझे यकीन नहीं है कि .NET Framework दृश्यों के पीछे मार्शलिंग के साथ कुछ कर रहा है या नहीं।सी # में संरचना संशोधनों में अप्रबंधित स्मृति को प्रभावित करेगा?

मुझे विश्वास है कि क्या होता है: मेरे अप्रबंधित डीएलएल से एक संरचना प्राप्त करते समय, यह कॉल करने के समान होता है जैसे कि कॉल को इंटिप्टर मिल जाता है और फिर इसे प्रबंधित स्मृति में संरचना की प्रतिलिपि बनाने के लिए और मार्शल क्लास का उपयोग करता है (और किए गए परिवर्तन प्रबंधित स्मृति में संरचना के लिए बुलबुला नहीं है)।

मुझे यह एमएसडीएन पर कहीं भी प्रलेखित नहीं लगता है। किसी भी लिंक की सराहना की जाएगी।

[DllImport("mydll.dll", BestFitMapping=false, CharSet=CharSet.Ansi)] 
private static extern int GetStruct(ref MyStruct s); 

[StructLayout(LayoutKind.Sequential, Pack=0)] 
struct MyStruct 
{ 
    public int Field1; 
    public IntPtr Field2; 
} 

public void DoSomething() 
{ 
     MyStruct s = new MyStruct(); 
     GetStruct(ref s); 

     s.Field1 = 100; //does unmanaged memory now have 100 in Field1 as well? 
     s.Field2 = IntPtr.Zero; //does unmanaged memory now have a NULL pointer in field Field2 as well? 
} 

उत्तर

0

CSharp भाषा Specification.doc स्नातकोत्तर 26

Struct कंस्ट्रक्टर्स नए ऑपरेटर के साथ लागू कर रहे हैं, लेकिन यह मतलब यह नहीं है कि स्मृति आवंटित की जा रही है। किसी ऑब्जेक्ट को गतिशील रूप से आवंटित करने और इसके संदर्भ को वापस करने के बजाय, एक संरचना निर्माता केवल संरचना मान को लौटाता है (आमतौर पर ढेर पर अस्थायी स्थान में), और यह मान तब आवश्यकतानुसार कॉपी किया जाता है।

चूंकि, 'स्ट्रक्चर' बैकिंग स्टोर के बारे में कुछ खास नहीं है, इसलिए कोई उम्मीद नहीं करेगा कि सदस्य असाइनमेंट के पीछे बेनामी मार्शलिंग ऑपरेशन हो।

+0

मुझे लगता है कि यह सही जवाब है। तथ्य यह है कि संरचनाओं (या इसके खेतों) में कुछ भी हुक नहीं होता है जब इसके क्षेत्र बदल जाते हैं तो अप्रबंधित स्मृति में परिवर्तन करने के लिए यह निष्कर्ष निकाला जाता है। – userx

8

नहीं, पी/आह्वान marshaller संरचना के कामयाब संस्करण में अप्रबंधित संरचना सदस्य मूल्यों की नकल की:

यहाँ की तरह मेरे कोड दिखता है। सामान्य रूप से, संरचना का प्रबंधित संस्करण किसी भी तरह से अप्रबंधित संस्करण के साथ संगत नहीं है। मेमोरी लेआउट खोजने योग्य नहीं है, सीएलआर संरचना को छोटे बनाने के लिए रीडर फ़ील्ड का उपयोग करता है। मार्शलिंग आवश्यक है, एक प्रतिलिपि बनाने के लिए में है।

दिए गए फ़ंक्शन हस्ताक्षर के साथ संरचना को संशोधित करना संभव नहीं है क्योंकि आप इसे पारित स्मृति में भरने देते हैं। फ़ंक्शन स्वयं ही संरचना की प्रतिलिपि बनाता है। हालांकि आप फील्ड 2 मान पर पार्टी कर सकते हैं क्योंकि यह एक कच्चा सूचक है। यदि यह किसी संरचना को इंगित करता है तो इसे Marshal.PtrToStructure() के साथ स्वयं मार्शल करें। इसकी प्रबंधित प्रति संशोधित करें और इसे Marshal.StructureToPtr() के साथ अप्रबंधित मेमोरी पर कॉपी करें। या सीधे मार्शल के साथ इसका उपयोग करें। ReadXxx() और WriteXxx()।

+0

यह वही है जो मैं उम्मीद करता हूं, लेकिन मैं वास्तव में एमएसडीएन या इस तरह की किसी तरह की पुष्टि की तलाश में हूं। इसके अलावा, एक पैक = 0 ठीक है (इसका मतलब केवल प्लेटफ़ॉर्म डिफ़ॉल्ट है और उसी कोड के साथ x86 और x64 परिनियोजन के लिए उपयोग करना महत्वपूर्ण है)। देखें: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.pack.aspx – userx

+1

यह वास्तव में लिंक खोजने के लिए एक अच्छी जगह नहीं है, मैं Google की अनुशंसा करता हूं। –

+0

मेरे प्रश्न में जो मैंने कहा वह बहाल करना वास्तव में कोई जवाब नहीं है :)। मैं किसी प्रकार के दस्तावेज की उम्मीद कर रहा हूं जो माइक्रोसॉफ्ट द्वारा लागू व्यवहार को समझाता है। – userx

संबंधित मुद्दे