C# का अन्य भाषाओं के साथ एकीकरण: P/Invoke से Python और JavaScript तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

C# वैक्यूम में क्यों नहीं रहता, और यह कैसे काम करता है

\n\n

जब मैंने लगभग दस साल पहले C# के साथ काम करना शुरू किया, तो मुझे लगा कि .NET एक आत्मनिर्भर ब्रह्मांड है। लाइब्रेरीज़, फ्रेमवर्क, डेटाबेस - सब कुछ हाथ में। लेकिन फिर एक कार्य आया: मुझे सिग्नल प्रोसेसिंग के लिए एक पुरानी C++ लाइब्रेरी का उपयोग करना था। और तब मुझे एहसास हुआ - C# का अन्य भाषाओं के साथ एकीकरण कोई विलासिता नहीं, बल्कि किसी भी गंभीर प्रोजेक्ट के लिए एक आवश्यकता है।

\n\n

आज C# एक समृद्ध पारिस्थितिकी तंत्र के साथ एक मल्टीप्लेटफ़ॉर्म भाषा है, लेकिन यह सब कुछ नहीं कर सकता। कभी-कभी मशीन लर्निंग के लिए Python स्क्रिप्ट चलाने की आवश्यकता होती है, कभी-कभी अधिकतम प्रदर्शन के लिए Rust से नेटिव फंक्शन को कॉल करना होता है, और कभी-कभी डायनामिक UI जनरेशन के लिए JavaScript इंजन को एम्बेड करना होता है। अच्छी खबर यह है: C# लगभग सभी के साथ दोस्ती कर सकता है।

\n\n

इस लेख में, मैं C# का अन्य भाषाओं के साथ इंटरैक्शन के वास्तविक परिदृश्यों को कार्यशील कोड, बेंचमार्क और संभावित समस्याओं के साथ दिखाऊंगा। चलिए शुरू करते हैं!

\n\n

P/Invoke: C और C++ के लिए क्लासिक तरीका

\n\n

Platform Invocation Services (P/Invoke) नेटिव DLL से फंक्शन कॉल करने के लिए .NET का अंतर्निहित तंत्र है। यह .NET के पहले संस्करण में ही आया था और C/C++ कोड के साथ एकीकरण का सबसे तेज़ तरीका बना हुआ है।

\n\n

मूल उदाहरण: C से फंक्शन कॉल करना

\n\n

मान लीजिए कि हमारे पास math_helper.dll नामक एक नेटिव लाइब्रेरी है जिसमें यह फंक्शन है:

\n\n
// math_helper.h\nextern "C" __declspec(dllexport) double calculate_power(double base, int exp);
\n\n

C# में हम इसे इस प्रकार जोड़ते हैं:

\n\n
using System.Runtime.InteropServices;\n\npublic class NativeMath\n{\n    [DllImport("math_helper.dll", CallingConvention = CallingConvention.Cdecl)]\n    public static extern double calculate_power(double base, int exp);\n}\n\n// उपयोग\ndouble result = NativeMath.calculate_power(2.0, 10);\nConsole.WriteLine($"2^10 = {result}"); // 1024
\n\n

P/Invoke C# के लिए महत्वपूर्ण बिंदु:

\n
    \n
  • हमेशा CallingConvention निर्दिष्ट करें - अक्सर Cdecl या StdCall।
  • \n
  • स्ट्रिंग के लिए MarshalAs(UnmanagedType.LPStr) या LPWStr का उपयोग करें।
  • \n
  • स्ट्रक्चर को ref या out के माध्यम से संदर्भ द्वारा पास करें।
  • \n
\n\n

P/Invoke न्यूनतम ओवरहेड देता है - प्रति कॉल शाब्दिक रूप से कुछ नैनोसेकंड। यदि आपको उच्च-लोड कंप्यूटेशन के लिए C# को C++ के साथ एकीकृत करने की आवश्यकता है - तो यह आपकी पसंद है।

\n\n

C++/CLI: दुनिया के बीच का पुल

\n\n

C++/CLI Visual C++ का एक एक्सटेंशन है जो आपको मैनेज्ड (.NET) और अनमैनेज्ड दोनों वातावरणों में काम करने वाला कोड लिखने की अनुमति देता है। यह कोई अलग भाषा नहीं है, बल्कि एक हाइब्रिड है जिसका उपयोग अक्सर C++ लाइब्रेरीज़ के लिए रैपर बनाने के लिए किया जाता है।

\n\n

OpenCV के लिए रैपर का उदाहरण

\n\n

मान लीजिए कि हमारे पास एक C++ फंक्शन है जो इमेज को प्रोसेस करता है:

\n\n
// NativeImageProcessor.h\n#pragma once\npublic ref class ImageProcessor\n{\npublic:\n    static System::Drawing::Bitmap^ ApplyFilter(System::Drawing::Bitmap^ bmp);\n};
\n\n

अंदर हम नेटिव OpenCV को कॉल करते हैं, और बाहर हम मैनेज्ड Bitmap देते हैं। C# से हम इसका उपयोग सामान्य .NET लाइब्रेरी की तरह करते हैं:

\n\n
using ImageProcessorLib;\n\nvar img = new Bitmap("photo.jpg");\nvar processed = ImageProcessor.ApplyFilter(img);\nprocessed.Save("filtered.jpg");
\n\n

C++/CLI एकीकरण मेमोरी पर पूर्ण नियंत्रण देता है और मार्शलिंग से बचने में मदद करता है। नकारात्मक पक्ष - कोड प्लेटफ़ॉर्म-निर्भर हो जाता है और डीबग करना कठिन होता है।

\n\n

Python.NET: C# से Python कॉल करना

\n\n

Python डेटा साइंस और मशीन लर्निंग का राजा है। और यदि आपके C# प्रोजेक्ट को, मान लीजिए, PyTorch पर न्यूरल नेटवर्क चलाने या spaCy के माध्यम से टेक्स्ट प्रोसेस करने की आवश्यकता है, तो Python.NET के माध्यम से C# से Python कॉल करना वही है जो आपको चाहिए।

\n\n

स्थापना और पहला उदाहरण

\n\n

पैकेज स्थापित करें:

\n\n
dotnet add package Python.Runtime.NETStandard

ब्लॉग

पुस्तक अनुशंसाएँ