2013-08-03 11 views
11

का उपयोग करने का सही तरीका मैं एक सी ++/सीएलआई एप्लिकेशन लिख रहा हूं, लेकिन मुझे अपने सी ++ डीएलएल में अधिकांश कोड मूल रूप से चलाने के लिए चाहते हैं (यानी प्रबंधित नहीं)।सी ++ सीएलआई #pragma प्रबंधित/अप्रबंधित

मुझे मॉड्यूल में केवल एक ही सीएलआई कक्षा मिली है, अन्य फाइलें सभी देशी सी ++ हैं।

तो, यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि उन देशी वर्गों को चलाया जा रहा है ... अच्छा, मूल रूप से?

मैं चाहिए:

  • ए) हर देशी वर्ग
  • बी के शीर्ष करने के #pragma अप्रबंधित जोड़े) बस #pragma अप्रबंधित जोड़ने से पहले मेरी एक CLI वर्ग
  • सी) कुछ में शामिल हैं अन्य?

धन्यवाद

उत्तर

12

आपको यह सुनिश्चित करने के लिए हुप्स से कूदना नहीं है। कंपाइलर केवल आईएल को उत्सर्जित करेगा जब यह आपके प्रोग्राम को/clr विकल्प के साथ संकलित करता है। यह प्रोजेक्ट विकल्प की तरह दिखता है लेकिन यह नहीं है।

बस अपनी .cpp फ़ाइलों का चयन करें जिनमें मूल कोड शामिल है। Ctrl कुंजी दबाकर और एक्सप्लोरर विंडो में फ़ाइल पर क्लिक करके उनमें से एक से अधिक का चयन करें। राइट-क्लिक करें + गुण, सी/सी ++, सामान्य। "सामान्य भाषा रनटाइम समर्थन" सेटिंग को "नहीं ..." में बदलें।

+1

यदि आप इसके लिए चरण-दर-चरण निर्देश देने जा रहे हैं, तो आप उन सीयू के लिए प्रीकंपील्ड हेडर फ़ाइलों के उपयोग को बंद करना भी शामिल करेंगे। चूंकि पीएच को प्रबंधित कोड के साथ बनाया जाएगा, और संकलक निरस्त हो जाएगा यदि यह '/ clr' के बिना चलाया जाता है और वह पीएच देखता है। –

+0

यह दृष्टिकोण सबसे सरल है, लेकिन @BenVoigt सही था। संकलन के लिए मुझे/yu के बजाय precompiled शीर्षलेख उपयोग/Yc में बदलना पड़ा। हालांकि, मैंने अभी तक ildasm के साथ परिणाम नहीं देखा है। – Xenoprimate

13

हमेशा की तरह मैं यह कोई नेट का समर्थन (/clr बिना संकलन) के साथ एक स्थिर पुस्तकालय परियोजना में मूल कोड डालने के लिए है। आप C12+/CLI प्रोजेक्ट में अलग-अलग फ़ाइलों के लिए /clr बंद कर सकते हैं लेकिन फिर प्रीकंपिल्ड हेडर वास्तव में भ्रमित हो जाते हैं। एक अलग पुस्तकालय परियोजना का उपयोग करना, देशी कोड के लिए देशी पीएच और प्रबंधित कोड के लिए एक प्रबंधित पीएचसी आसान है।

फिर मैं डीएलएल बनाने के लिए उस मूल सी ++ .lib के साथ अपने सी ++/सीएलआई कोड को लिंक करता हूं। आप जो भी करते हैं वह एक परियोजना निर्भरता निर्धारित करता है और विजुअल स्टूडियो बाकी की देखभाल करता है।

यदि आप बिल्कुल उसी संकलन इकाई में देशी और प्रबंधित कोड को जोड़ना चाहते हैं तो आप #pragma managed(push, off) और #pragma managed(pop) का भी उपयोग कर सकते हैं। लेकिन आमतौर पर हेडर फाइलों में मौजूद कोई भी कोड वहां होता है क्योंकि आप इसे रेखांकित करना चाहते हैं ... जिसका अर्थ यह है कि प्रबंधित सीयू में शामिल होने पर इसे प्रबंधित मोड में होना चाहिए, इसलिए इसे प्रबंधित कार्यों में रेखांकित किया जा सकता है।


अपनी टिप्पणी इस जवाब, Hans has begun recommending my approach की छवि खराब करने के बावजूद।

+0

यह * बहुत * अनुपयोगी है, अलग-अलग परियोजनाओं को बनाए रखता है और यह सुनिश्चित करता है कि वे सही तरीके से लिंक करें, पूरी तरह से अनावश्यक है। कृपया अपना उत्तर हटाएं। –

+6

@ हंस: आपकी टिप्पणी से मैं केवल यह मान सकता हूं कि आपने वास्तव में आपके उत्तर में अनुशंसित दृष्टिकोण नहीं लिया है। और आपने मेरा जवाब पूरी तरह से नहीं पढ़ा, क्योंकि मैंने उस समाधान को भी दिया है, और प्रीकंपील्ड हेडर फ़ाइलों के साथ होने वाली समस्याओं को इंगित किया है। –

+1

मैंने पहली बार हंस के दृष्टिकोण की कोशिश की, लेकिन फिर पीसीएच समस्या को मारा - मैंने अब मूल सामग्री को एक स्थिर lib में विभाजित कर दिया है और यह एक आकर्षण की तरह काम करता है। (इसके अलावा, बहुत साफ क्लीनर, क्योंकि कोई फ़ाइल-विशिष्ट सेटिंग्स नहीं हैं, केवल प्रोजेक्ट-व्यापी सेटिंग्स हैं।) –

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