2010-03-10 14 views
5

मैंने सॉकेट के माध्यम से भेजने के लिए एक संरचना परिभाषित की है। मैं इसका आकार प्राप्त करना चाहता हूं लेकिन sizeof असुरक्षित है और "System.Runtime.InteropServices.MarshalSizeOf" के लिए समान है। क्या इसका आकार सुरक्षित तरीके से प्राप्त करने का कोई तरीका है?सी # क्यों आकार असुरक्षित है और एक सुरक्षित तरीके से संरचना का आकार कैसे प्राप्त करें?

+0

सुरक्षित परिभाषित करें। जहां तक ​​सीएलआर का संबंध है, 'मार्शल.SizeOf' पूरी तरह से सुरक्षित है। – Noldorin

+1

नोल्डोरिन - मार्शल.SizeOf को निष्पादित करने के लिए UnSafe कोड अनुमति सेट की आवश्यकता है। यह ओपी का मुद्दा –

+0

मैंने सिस्टम की कोशिश की। Runtime.InteropServices.MarshalSizeOf (typeof (MyStruct)) और कहीं भी "असुरक्षित" नहीं है और असुरक्षित कोड चेकबॉक्स को अनचेक भी किया गया है। यह अब मेरे लिए ठीक काम करता है। ?????? – 5YrsLaterDBA

उत्तर

3

प्रबंधित structs के लिए ऐसा करने का कोई तरीका नहीं है। Marshal.SizeOf केवल मार्शेल प्रकारों पर डेटा के आकार को वापस कर देगा जिसमें संरचना शामिल है ... मई कुछ प्लेटफ़ॉर्म पर प्रबंधित प्रकारों के लिए सही हो, लेकिन दूसरों पर नहीं।

यह डिज़ाइन द्वारा है इसलिए जेआईटी प्लेटफार्म के आधार पर अलग-अलग structs रख सकता है।

अधिक यहाँ जानकारी: Chris Brumme's blog

+3

महत्वपूर्ण सवाल यह है कि आपको संरचना के आकार को जानने की आवश्यकता क्यों है? बाधाएं यह एक असुरक्षित कारण के लिए है (जिस स्थिति में आप 'आकार' का उपयोग कर सकते हैं) या यह पी/आमंत्रण के लिए है (जिस स्थिति में 'मार्शल। सिस्टऑफ' सही उत्तर है)। – Gabe

+1

सहमत हुए। सिर्फ मूल प्रश्न का उत्तर देने की कोशिश कर रहा था: "क्यों आकार असुरक्षित है और एक सुरक्षित तरीके से संरचना का आकार कैसे प्राप्त करें?" :-) – Jcl

+1

एक कारण: आप कई संरचनाओं की एक सरणी बनाना चाहते हैं और आपको यह जानने की जरूरत है कि 2 जीबी में कितने फिट होंगे। आपको यह जानने की जरूरत है कि रनटाइम कितनी मेमोरी संरचना के लिए आवंटित करेगा। –

0

आप यह निर्धारित क्या JIT (रनटाइम पर) परिभाषित करेगा कामयाब प्रकार के आकार हो जाएगा देता है कि एक आवरण पुस्तकालय के लिए my blog post देखें। यह sizeof आईएल निर्देश का उपयोग करके काम करता है जो सी # में बिल्कुल प्रकट नहीं होता है। इसे किसी भी विशेष अनुमति के साथ चलाया जा सकता है और सत्यापित है।

नोट: यह वास्तव में आप जो चाहते हैं वह हो सकता है या नहीं भी हो सकता है। यह एक संरचना के लिए 8 वापस कर सकता है जो वास्तव में केवल एक ही बाइट है। मैं वास्तव में आपके प्रश्न को पूरी तरह से समझ नहीं पा रहा हूं, इसलिए मुझे यकीन नहीं है कि यह वास्तव में आप क्या चाहते हैं या नहीं।

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