2009-04-21 9 views
10

के बराबर .NET समकक्ष मेरे पास .NET कोड का एक टुकड़ा है जिसे मैं 64-बिट पर पोर्ट करना चाहता हूं। कोड मूल रूप से कुछ अन्य सी डीएल में पी/Invoke कॉल का एक सेट है। सी डीएल में कार्यों में से एक पैरामीटर 'size_t' है। मैं अपने पी/Invoke हस्ताक्षर में क्या डेटाटाइप का उपयोग करना चाहिए ताकि marshalling ठीक काम करता है। मैं एक इंटप्राट या UIntPtr का उपयोग करने के बारे में सोच रहा था लेकिन कुछ कहते हैं कि वे .NET में एक सूचक समकक्ष चीज हैं और इसका उपयोग नहीं करना चाहिए। क्या किसी को पता है कि इसके लिए सही प्रकार क्या है?आकार_t

+0

सी डीएलएल क्या "बिट-नेस" है? –

उत्तर

17

UIntPtr काम करेंगे (IntPtr शायद बहुत काम करेगा, लेकिन size_t अहस्ताक्षरित है, इसलिए UIntPtr बेहतर विकल्प है)

JaredPar पर कुछ लिखा है उसके blog (और एक follow-up) इस बारे में।

1

यदि आकार_टी प्लेटफ़ॉर्म के आधार पर भिन्न होता है, तो आपको IntPtr का उपयोग करना होगा। यदि यह एक निश्चित आकार पूर्णांक है, तो int, uint या long (मूल घोषणा के आधार पर) का उपयोग करें।

1

इस Document by Microsoft

यह 64 बिट आवेदन size_t के लिए कहते हैं पर एक नज़र 64 बिट पूर्णांक है।

हालांकि, अगर DLL आप कॉल कर रहे एक 32 बिट dll है, आप केवल एक 32 बिट पूर्णांक

1

पारित करने के लिए मैं आप समान व्यवहार प्राप्त करने में मदद कर सकते हैं कि एक गंदा हैक पाया है की जरूरत है। यह जरूरी है कि आप अपने 64-बिट बनाता है के लिए एक संकलन प्रतीक _WIN64 को परिभाषित करने और फिर तुम क्या कर सकते हैं निम्नलिखित:

#if _WIN64 
    using size_t = UInt64; 
#else 
    using size_t = UInt32; 
#endif 

नोट: यदि आप हर फ़ाइल size_t प्रकार का उपयोग करना चाहता है कि में उपरोक्त कोड का उपयोग करना होगा ।

आप अपने स्वयं के पूर्णांक प्रकार को भी परिभाषित कर सकते हैं (UIIN64 को परिभाषित किया गया है) और उपरोक्त कोड को प्रत्येक फ़ाइल में डालने के बिना इसका उपयोग करें जिसे size_t तक पहुंच की आवश्यकता है, लेकिन यह बहुत जटिल है (imho)।

#if _WIN64 
    using _size_t = UInt64; 
#else 
    using _size_t = UInt32; 
#endif 

[Serializable] 
[CLSCompliant(false)] 
[ComVisible(true)] 
public struct size_t : IComparable, IFormattable, IConvertible, IComparable<_size_t>, IEquatable<_size_t> 
{ 
    private _size_t _value; 

    public size_t(_size_t val) 
    { 
     _value = val; 
    } 

    // You have to add all of your overloads below 
} 

यह बात के प्रकार मंच पर निर्भर करता है, लेकिन सही ढंग से आवश्यक ऑपरेटरों अधिक भार बहुत मुश्किल है बदलने के लिए size_t अनुमति देगा!

+1

संकलन प्रतीक को परिभाषित करने का मतलब है कि यह किसी भी CPU निर्माण के लिए काम नहीं करेगा, और अगर कोई निष्पादन योग्य कुछ और (x86/x64) चलाने के लिए संशोधित करता है तो यह क्रैश हो जाएगा। –

+0

@ ØysteinE.Krog मैं सहमत हूं, मुझे आमतौर पर यह भी पता चलता है कि आपको वास्तव में 'size_t' की आवश्यकता नहीं है जब तक कि आप C++ dll के साथ काम नहीं कर रहे हों, इसलिए उस स्थिति में आप किसी भी CPU के साथ संकलित नहीं होंगे और इसे काम करना चाहिए। यह एक गंदा पर्याप्त हैक है कि बहुत कम मामले हैं जो इसका उपयोग कर वारंट करते हैं। – Kiril