C# pInvoke with long in both 32 & 64 Bit Linux: -


मुझे लिनक्स-फ़ंक्शन कॉल करने की आवश्यकता है

यह घोषणा है कि int sysinfo (struct sysinfo * info) ;

लिनक्स 2.3.16 तक, sysinfo () निम्न संरचना में जानकारी वापस करने के लिए उपयोग किया जाता है:

  struct sysinfo {लंबे अपटाइम; बूट के बाद / सेकंड * / अहस्ताक्षरित लंबे भार [3]; / * 1, 5, और 15 मिनट की लोड औसत * / अहस्ताक्षरित लंबे कुलराम; / * कुल प्रयोग करने योग्य मुख्य मेमोरी आकार * / अहस्ताक्षरित लंबे समय तक freeram; / * उपलब्ध स्मृति आकार * / अहस्ताक्षरित लंबे शेयर्रम; / * साझा स्मृति * / अहस्ताक्षरित लंबे बफररम की राशि; / * बफ़र्स द्वारा उपयोग की जाने वाली मेमोरी * / अहस्ताक्षरित लंबे तुलनीय; / * कुल स्वैप स्पेस आकार * / अहस्ताक्षरित लंबे समय से फ़्रीप्स; / * स्वैप स्पेस अभी भी उपलब्ध है * / अहस्ताक्षरित छोटी procs; / * मौजूदा प्रक्रियाओं की संख्या * / चार _ एफ [22]; / * पैड की संरचना से 64 बाइट्स * /};  

और आकार बाइट्स में दिए गए थे।

लिनक्स 2.3.23 (i386), 2.3.48 (सभी आर्किटेक्चर) के बाद से संरचना है:

  स्ट्रेट sysinfo {लंबे अपटाइम; बूट के बाद / सेकंड * / अहस्ताक्षरित लंबे भार [3]; / * 1, 5, और 15 मिनट की लोड औसत * / अहस्ताक्षरित लंबे कुलराम; / * कुल प्रयोग करने योग्य मुख्य मेमोरी आकार * / अहस्ताक्षरित लंबे समय तक freeram; / * उपलब्ध स्मृति आकार * / अहस्ताक्षरित लंबे शेयर्रम; / * साझा स्मृति * / अहस्ताक्षरित लंबे बफररम की राशि; / * बफ़र्स द्वारा उपयोग की जाने वाली मेमोरी * / अहस्ताक्षरित लंबे तुलनीय; / * कुल स्वैप स्पेस आकार * / अहस्ताक्षरित लंबे समय से फ़्रीप्स; / * स्वैप स्पेस अभी भी उपलब्ध है * / अहस्ताक्षरित छोटी procs; / * वर्तमान प्रक्रियाओं की संख्या * / अहस्ताक्षरित लंबे कुलहै; / * कुल उच्च स्मृति आकार * / अहस्ताक्षरित लंबे फ्रीहॉ; / * उपलब्ध उच्च स्मृति आकार * / अहस्ताक्षरित int mem_unit; / * बाइट्स में मेमोरी यूनिट आकार * / char _f [20-2 * आकार (लंबे) -सिसेफ (इंट)]; / * 64 बाइट्स के लिए पैडिंग * /};  

यह मैं जो अभी तक किया है:

फ़ंक्शन पिनवोक:

  निजी कॉन्स्ट स्ट्रिंग do notFindLibC = @ "/ lib / x86_64-linux-जीएनयू / libc.so.6 "; [System.Runtime.InteropServices.DllImport (DoesntFindLibC)] निजी स्थिर extern int sysinfo (रेफरी sysinfo_t जानकारी);  

और संरचना मानचित्रण:

  [system.Runtime.InteropServices.StructLayoutAttribute (System.Runtime.InteropServices.LayoutKind.Sequential)] struct sysinfo_t {सार्वजनिक System.UIntPtr अपटाइम; / * सेकंड बूट * / [System.Runtime.InteropServices.MarshalAs (System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 3)] सार्वजनिक System.UIntPtr [] लोड के बाद से; / * 1, 5, और 15 मिनट की लोड औसत * / सार्वजनिक सिस्टम। यूआईएनटीपीटीआर कुलक्रम; / * कुल प्रयोग करने योग्य मुख्य मेमोरी आकार * / सार्वजनिक सिस्टम। यूआईएनटीपीट्र फ्रीराम; / * उपलब्ध मेमोरी आकार * / सार्वजनिक सिस्टम। यूआईएनटीपीट्र शेयरम; / * साझा की गई स्मृति * / सार्वजनिक सिस्टम। यूआईएनटीपीट्र बफररम; / * मेमोरी बफ़र्स * / // [System.Runtime.InteropServices.MarshalAs (System.Runtime.InteropServices.UnmanagedType सार्वजनिक System.UIntPtr totalswap द्वारा इस्तेमाल किया;। / * कुल स्वैप स्पेस आकार * / सार्वजनिक System.UIntPtr freeswap; / * स्वैप अंतरिक्ष अभी भी उपलब्ध * / सार्वजनिक ushort procs; / * पैड; / * वर्तमान प्रक्रियाओं * / [System.Runtime.InteropServices.MarshalAs (System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 22)] सार्वजनिक चार [] _f की संख्या 64 बाइट्स के लिए संरचना * /}  

समस्या यह है कि सी कोड में "लंबे" प्रोसेसर-वास्तुकला-विशिष्ट है, क्योंकि x 86 32-bit Linux में, लंबे आकार 32 बिट है, और 86 64-bit Linux में, यह 64 बिट है, तो मैं IntPtr ले जाना है, और क्योंकि यह अहस्ताक्षरित है, मैं UIntPtr ले।

सी # / मोनो हालांकि, लंबे समय हमेशा Int64 के रूप में परिभाषित किया जाता है।

अब यह इंटरप्यूटी के साथ काम करने में थोड़ा असुविधाजनक है। क्या कोई मार्शल एट विशेषता है जो मैं आवेदन कर सकता हूं, या कस्टम मार्शलर जिसे मैं लिख सकता हूं ताकि मैं वास्तव में उलटा हो ई संरचना, लेकिन यह मूल रूप से IntPtr के लिए नक्शे है? इसलिए कि एक ही कोड x86-32 और x86-64 दोनों पर काम करता है।

नहीं, आप इसे ठीक करने के लिए कर सकते हैं।

आप हालांकि फ़ील्ड छुप सकते हैं और प्रॉपर्टी एक्सेसर्स प्रदान कर सकते हैं:

  का उपयोग करके System.Runtime.InteropServices; [स्ट्रक्चरआउटआउट विशेषता (लेआउटकिंड। सिक्विक)] स्ट्रेट sysinfo_t {System.UIntPtr _uptime; बूट के बाद / सेकंड * / सार्वजनिक उलऑन अपटाइम {वापसी (उलटा) _uptime; } सेट {_uptime = new UINTPtr (मान); }} [मार्शल (UnmanagedType.ByValArray, SizeConst = 3)] सिस्टम। यूआईएनटीपीटी [] _ ​​लोड्स; / * 1, 5, और 15 मिनट की लोड औसत * / सार्वजनिक उलॉन्ग [] लोड {मिलते हैं} नया लौओग [] {(उलॉंग) _ लोड्स [0], (उलॉंग) _ लोड्स [1], (उलॉन्ग) _लोड [1] )}; सेट {_loads = new UINTPTR} [नया UIintPtr (मान [0]), नया UIintPtr (मान [1]), नया UIintPtr (मान [2])}; }} // आदि}  

Comments

Popular posts from this blog

Pass DB Connection parameters to a Kettle a.k.a PDI table Input step dynamically from Excel -

multithreading - PhantomJS-Node in a for Loop -

c++ - MATLAB .m file to .mex file using Matlab Compiler -