2012-03-19 15 views
9

प्रश्नोत्तरी: निम्न प्रोग्राम प्रिंट क्या करता है?स्ट्रक्चरलाइट पैक = 1 बूल के साथ काम नहीं करता है?

using System; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication2 { 

    [StructLayout(LayoutKind.Sequential, Pack=1)] 
    struct Struct1 { 
     bool b; 
     int i; 
    } 

    [StructLayout(LayoutKind.Sequential, Pack=1)] 
    struct Struct2 { 
     byte b; 
     int i; 
    } 

    class Program { 
     static void Main(string[] args) { 
      Console.WriteLine(Marshal.SizeOf(typeof(Struct1))); 
      Console.WriteLine(Marshal.SizeOf(typeof(Struct2))); 
      Console.ReadKey();    
     } 
    } 
} 

उत्तर:

8 
5 

यह मेरे लिए बहुत भ्रामक है। बूल और बाइट दोनों के पास 1 बाइट का आकार होता है, और [StructLayout(LayoutKind.Sequential, Pack=1)] निर्दिष्ट करने से किसी भी पैडिंग मुद्दे को रद्द करना चाहिए। दोनों structs 5 बाइट होना चाहिए। तो मेरे पास दो प्रश्न हैं:

  • मार्शलिंग इस तरह से क्यों काम करता है?
  • कोई कामकाज? मेरे पास देशी structs में 1-बाइट बूलियन हैं जिन्हें मुझे आयात करने की आवश्यकता है। मैं निश्चित रूप से बाइट का उपयोग कर सकता हूं लेकिन यह "गन्दा" है।

धन्यवाद।

उत्तर

18

डिफ़ॉल्ट रूप से, .NET प्रकार अप्रबंधित प्रकार BOOL, जो typedefint को एड है bool मार्शलों। आप के लिए और 1-बाइट अप्रबंधित बूलियन्स से मार्शल करने के लिए चाहते हैं, एक विशेषता के साथ marshaler को यह संकेत मिलता है:

[StructLayout (LayoutKind.Sequential, Pack=1)] 
struct Struct3 { 
    [MarshalAs (UnmanagedType.I1)] 
    bool b; 
    int i; 
} 

Console.WriteLine (Marshal.SizeOf (typeof (Struct3))) ; // prints 5 
+0

यह एक चमकदार माइक्रोसॉफ्ट-आईएसएम है: बूल सी और सी ++ में 1 बाइट है। यह कभी मेरे लिए कभी नहीं हुआ होगा कि वे माइक्रोसॉफ्ट-विशिष्ट टाइपपीफ के लिए मार्शल करेंगे। – Asik

+9

बूलियन सी में केवल पूर्णांक हैं (कम से कम प्री-सी 99)। केवल सी ++ में मूल 'बूल' प्रकार होता है। 'Int' का उपयोग करके इंटरऑपरेबिलिटी के लिए बूलियन बेहतर है, क्योंकि यह अधिक आम है। – SztupY

2

bool, एक int32 को मार्शल हो जाता है अंतर कारणों के लिए (C/C++ कार्यक्रम आम तौर पर बूलियन्स रूप int का उपयोग , और winapi BOOL में typedef एड int के रूप में भी है), इसलिए इसे 4 बाइट में परिवर्तित कर दिया गया है।

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