2010-03-25 20 views
15

क्या सी हेडर से .net के लिए स्वचालित रूप से पी/आवेक रैपर बनाने का कोई तरीका है?स्वचालित रूप से सी हेडर से सी # रैपर बनाना?

बेशक मैं उन्हें हाथ से बना सकता हूं, लेकिन उन्हें बनाए रखना दर्दनाक होगा, और शायद मैं कहीं गलती कर दूंगा जिसके परिणामस्वरूप दुर्घटनाओं को डीबग करना मुश्किल हो जाएगा।

मैंने SWIG की कोशिश की, लेकिन इसने पूर्ण कक्षाएं बनाईं जहां सरल structs पर्याप्त होंगे। एसडब्ल्यूआईजी के साथ एक और समस्या यह है कि इसे सी पक्ष पर अतिरिक्त इंटरऑप कोड की आवश्यकता होती है।

मैं मानना ​​चाहूंगा कि उत्पादन मोनो पर भी काम करता है, लेकिन यह आवश्यक नहीं है।

एक और चीज जिसके साथ मैं काम कर सकता हूं वह एक प्रोग्राम है जो सी हेडर को पार करता है, और एक्सएमएल जैसे अच्छे इंटरमीडिएट प्रारूप में आउटपुट बनाता है, जिससे मैं स्वयं सी # रैपर बना सकता हूं।

संपादित करें:
PInvoke इंटरऑप सहायक मुझे चाहिए।
इसके साथ कुछ छोटे मुद्दे हैं:
* यह स्ट्रिंग के लिए "हस्ताक्षरित चार *" का अनुवाद करता है जहां मैं IntPtr
* पसंद करता हूं * यह मानता है कि size_t = int = long = 32bit। यह वर्तमान में मेरे लिए सच है, लेकिन हर मंच पर सच नहीं हो सकता है।
क्या इसे ठीक करने का कोई साफ तरीका है? अन्यथा मैं इसे बदलने से पहले सी कोड पर थोड़ा सा ढूंढ और प्रतिस्थापित करूँगा।

उत्तर

10

PInvoke Interop Assistant आपके लिए बेहतर फिट होना चाहिए, यह विशेष रूप से सी कोड के साथ काम करने के लिए डिज़ाइन किया गया था।

बस सावधान रहें कि कोई उपकरण आपको 100% गारंटीकृत समाधान नहीं देता है, सी घोषणा रास्ता पूरी तरह मुसीबत मुक्त परिणाम की गारंटी देने के लिए बहुत संदिग्ध है। पॉइंटर्स के कारण परेशानी, सी कोड में सर्वव्यापी। यह बताने का कोई तरीका नहीं है कि स्मृति को पढ़ने या लिखने के लिए पॉइंटर का उपयोग किया जाता है। अथवा दोनों। या जो स्मृति को जारी करने के लिए जिम्मेदार है।

यह स्थिर कोड विश्लेषकों के लिए एक प्रमुख हैंगअप भी है, अगर वे नहीं जानते कि पॉइंटर का उपयोग कैसे किया जाता है तो वे एक सभ्य नौकरी नहीं कर सकते हैं। वे केवल इसे उपयोग से अनुमानित कर सकते हैं, लेकिन यह चिकन-एंड-अंडे की समस्या है, उपयोग गलत हो सकता है। माइक्रोसॉफ्ट ने SAL annotations के साथ अपने स्वयं के शीर्षकों में समस्या को संबोधित किया, अतिरिक्त मार्कअप जो एक कंपाइलर के तटस्थ है लेकिन कोड विश्लेषक द्वारा पार्स किया जा सकता है। वे स्पष्ट रूप से इच्छित सूचक को एक सूचक कहते हैं।

पिनवोक इंटरऑप सहायक द्वारा भी उपयोग किया जाता है, यही कारण है कि यह Winapi घोषणाओं पर बेहतर काम कर सकता है। लेकिन यह निश्चित रूप से केवल माइक्रोसॉफ्ट हेडर पर काम करता है, इन एसएएल एनोटेशन आमतौर पर व्यस्त सी प्रोग्रामर द्वारा लिखे गए कोड पर गायब होते हैं।

+1

मैं इंटरऑप सहायक से सहमत हूं। सावधान रहें कि जीयूआई में एक कष्टप्रद बग है (सीमित लंबाई, परेशान करना यदि आप कई शीर्षलेख फ़ाइलों का अनुवाद करना चाहते हैं) और बिटफील्ड के लिए जेनरेट सी # कोड न केवल बदसूरत है, बल्कि गलत है (यानी आपको * सत्यापित करना होगा बिट फ़ील्ड कोड मैन्युअल रूप से)। बिट फ़ील्ड्स को छोड़कर कुछ भी करने के लिए, मैंने इसे ठीक काम करने के लिए पाया, हालांकि कोड के साथ पहली चीज लंबी नामस्थानों को हटा देना है (प्रत्येक सिस्टम के लिए 'System.Runtime.InteropServices')। – OregonGhost

+1

इसके साथ कुछ छोटे मुद्दे हैं। यह स्ट्रिंग में "हस्ताक्षरित चार *" का अनुवाद करता है जहां मैं IntPtr पसंद करूंगा, और मानता हूं कि int = long = 32bit। क्या इसे ठीक करने का कोई साफ तरीका है? अन्यथा मैं इसे बदलने से पहले सी कोड पर थोड़ा सा ढूंढ और प्रतिस्थापित करूँगा। – Winner

+1

वे उन अस्पष्टताओं हैं जिन्हें मैंने आपको चेतावनी दी थी। जेनरेट पी/टॉकर घोषणा को टिंकर करने का कोई साफ तरीका सामान्य नहीं है। बीटीडब्ल्यू: अधिकांश सी/सी ++ कोड में int और long 32-बिट्स है। –

1

यदि मैं आपका प्रश्न सही ढंग से समझता हूं, तो आप मूल रूप से पूछ रहे हैं कि SWIG क्या करने का कोई तरीका है या नहीं।

बेशक, आप इसे थोड़ा अलग करना चाहते हैं, इसलिए एक विकल्प एसडब्ल्यूआईजी कोड लेना होगा और जिस तरह से आप चाहें काम करने के लिए इसे बदलना होगा।

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