हम अपने क्षितिज को व्यापक बनाते हैं। शार्पवेदक AddIns

मैं अब लगभग एक साल से शार्पडेवलप से परिचित हूं। कम से कम टॉप-एंड लैपटॉप कहने के लिए, वह बहुत अच्छा महसूस करता है और एक ही समय में अपने अधिकांश कार्यों को हल करने का प्रबंधन करता है। लेकिन किसी भी अन्य विकास उपकरण की तरह, यह सर्वशक्तिमान नहीं है। समय-समय पर आपको विज़ुअल स्टूडियो और अन्य टूल को चालू करना होगा। कभी-कभी स्व-निर्मित प्रोजेक्ट टेम्पलेट और फ़ाइल टेम्पलेट मदद करते हैं। कभी-कभी - उपकरण मेनू के माध्यम से कंसोल उपयोगिताओं को जोड़ना। लेकिन मुझे कुछ और चाहिए।



SharpDevelop है, जैसा कि आप जानते हैं, ओपन सोर्स। इसलिए उसका कोड लेने के लिए कुछ भी नहीं रोकता है और वह फिर से लिखता है। लेकिन इसे अंतिम उपाय के रूप में छोड़ देते हैं। SharpDevelop के पास प्लगइन्स या AddIns को लिखने का एक शानदार अवसर है, जैसा कि लेखक उन्हें कहते हैं। इसलिए, आज हम प्लगइन्स पर ध्यान केंद्रित करेंगे और विश्लेषण करेंगे कि वे कैसे काम करते हैं और उन्हें कैसे लिखना है। एक उदाहरण के लिए हम माइक्रोसॉफ्ट मोल्स आइसोलेशन फ्रेमवर्क के समर्थन के लिए एक सरल प्लग-इन लिखेंगे।



इससे पहले, मैं कुछ प्लगइन कार्यान्वयन पर आया था। मैंने एक-दो बार अपना संस्करण बनाया। लेकिन यह नीले रंग से बाहर नहीं दिखता है जो मैंने शार्पडेवलप में देखा था। इसमें लगभग सब कुछ प्लगइन्स के रूप में लागू किया जाता है। संपादकों की खिड़कियां, साइडबार, संवाद, विभिन्न भाषाओं के लिए समर्थन, टूलबार तत्व, मेनू बार के व्यक्तिगत तत्व और संदर्भ मेनू। यदि आप सभी प्लगइन्स को हटाते हैं, तो वह सब कुछ है जो प्लगइन्स को सपोर्ट करने के लिए कर्नेल है।



थोड़ा इतिहास



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



पहला संस्करण .NET RichTextBox के साथ एक नियमित विंडो थी। वह कोड के साथ फ़ाइलों को डाउनलोड करना और csc.exe का उपयोग करके उन्हें संकलित करना जानती थी। अगला प्रोजेक्ट फ़ाइलों के प्रबंधन के लिए अपना स्वयं का पाठ संपादक और उपकरण बनाया गया था। थोड़ी देर के बाद, SharpDevelop इस पर विकास जारी रखने के लिए पर्याप्त स्थिर था।



2001 की शुरुआत में, पहला AddIn कार्यान्वयन दिखाई दिया। यह काफी सरल था - आप केवल मुख्य मेनू पर एक विशेष आइटम में आइटम जोड़ सकते हैं। और 2002 की शुरुआत में, AddIn प्रणाली ने अपना अंतिम रूप प्राप्त कर लिया, जिसमें यह आज तक बच गया।



एडिन का पेड़



डेवलपर्स ने खुद को एक गंभीर कार्य निर्धारित किया - प्लगइन्स की ऐसी प्रणाली को लागू करना आवश्यक था ताकि दूसरों की मदद से कुछ प्लगइन्स का विस्तार करना संभव हो सके। तो AddIn ट्री का विचार आया। AddIn ट्री आपको XML का उपयोग करके एक्सटेंशन का वर्णन करने और पथ निर्दिष्ट करके उन्हें लगभग कहीं भी कनेक्ट करने की अनुमति देता है।



सभी नई कार्यक्षमता को उस पथ की घोषणा करनी चाहिए जिसके साथ उसे रखा गया है। पथ एक पेड़ में एक पथ को संदर्भित करता है, जड़ से एक विशिष्ट नोड तक। उदाहरण के लिए, "/ SharpDevelop / Workbench / MainMenu"। एक रास्ता सिर्फ एक स्ट्रिंग है जो आपको उन एक्सटेंशनों को खोजने की अनुमति देता है जिनकी आपको आवश्यकता है।



सभी एक्सटेंशन में एक * .addin (XML) फ़ाइल होनी चाहिए जो उनका वर्णन करती है। एक्सटेंशन तर्क वाले एक या अधिक .NET असेंबली भी हो सकते हैं। रन के समय में, एडिन फाइलों की सामग्री को एक ही पेड़ में मिला दिया जाता है। लेकिन संबंधित असेंबली अभी लोड नहीं हो सकता है।



उदाहरण के लिए, पथ "/ SharpDevelop / Workbench / MainMenu" में सभी मुख्य मेनू आइटम हैं। इस मेनू को रेंडर करते समय ट्री का उपयोग किया जाता है, और कोड को केवल तब लोड किया जाता है जब उसका कोई आइटम चुना जाता है। पैनलों के साथ, स्थिति समान है - जबकि पैनल बंद या कम से कम है, इसका कोड मेमोरी में लोड नहीं किया गया है। यह SharpDevelop के स्टार्टअप समय को काफी कम कर सकता है।



विचार करें कि विस्तार का वर्णन करने के लिए पथ का उपयोग कैसे किया जाता है।



< AddIn >

<!-- some stuff -->



< Path name ="/SharpDevelop/Workbench/MainMenu" >

<!-- node with id="View" -->

<!-- node with id="Edit" -->

</ Path >

</ AddIn >






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



उसके बाद, प्रत्येक नोड स्वयं पथ का एक तत्व बन जाता है। उदाहरण के लिए, "/ SharpDevelop / Workbench / MainMenu / Edit"। इसलिए, आप इस रास्ते में नए नोड जोड़ सकते हैं:



< Path name ="/SharpDevelop/Workbench/MainMenu/Edit" >

<!-- node with id="Copy" -->

<!-- node with id="Paste" -->

</ Path >






संपादन मेनू आइटम को एक प्लगइन में लागू किया जा सकता है, और दूसरे में कॉपी और पेस्ट आइटम। इस प्रकार, पेड़ में रास्तों का उपयोग करके, आप न केवल अपने एक्सटेंशन जोड़ सकते हैं, बल्कि मौजूदा लोगों को "विस्तार" भी कर सकते हैं।



Doozer



संक्षेप में संक्षेप में बताएं। AddIn रूट तत्व के साथ XML फ़ाइल हमें अपने एक्सटेंशन का वर्णन करने की अनुमति देती है। विशेष रूप से, कार्यक्रम में यह "विस्तार" किस स्थान पर है। कोड ही एक अलग .NET असेंबली में संग्रहीत है। तो अब हमें एक्सएमएल फाइल में वर्णन करना होगा कि इस कोड को कैसे चलाना है।



ऐसा करने के लिए, SharpDevelop के निर्माता अमूर्त के एक विशेष स्तर के साथ आए - डूज़र (जिसे पहले कोडन कहा जाता था)। डूमर मापदंडों का उपयोग करके सभी प्रकार की वस्तुओं को बनाने में मदद करता है - एक्सएमएल विशेषताएँ। उदाहरण के लिए, MenuItemDoozer एक मेनू आइटम बना सकता है, और PadDoozer पैनल बना सकता है (जैसे क्लास व्यू या टूलबॉक्स)। अब हम डोजर को इसमें जोड़कर विस्तार के हमारे विवरण को अपडेट कर सकते हैं।



< AddIn >

<!-- some stuff -->



< Path name ="/SharpDevelop/Workbench/MainMenu" >

< MenuItem id ="Edit"

label ="Edit"

class ="Namespace.EditCommandImplementation" />

</ Path >

</ AddIn >






लेबल मेनू आइटम का नाम है जिसे स्क्रीन पर प्रदर्शित किया जाएगा। क्लास उस वर्ग का नाम है जो IMenuCommand इंटरफ़ेस (ICommand से विरासत में मिला) को लागू करता है। जब आप एक मेनू आइटम पर क्लिक करते हैं, तो इस वर्ग का एक ऑब्जेक्ट बनाया जाता है और इसकी रन विधि कहा जाता है।



डेवलपर के निपटान में पहले से ही कई तैयार किए गए डोजर्स हैं। पूरी सूची प्रलेखन में पाई जा सकती है (लेख के अंत में सभी लिंक)। वे सभी IDoozer इंटरफ़ेस को लागू करते हैं, और उनका नाम डूज़र में समाप्त होता है। XML फ़ाइल में, डोज़र प्रत्यय छोड़ा गया है।



सभी डोजर्स टीमों के साथ काम नहीं करते हैं। उदाहरण के लिए, ClassDoozer बस डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके एक क्लास ऑब्जेक्ट बनाता है और इसे ट्री में सम्मिलित करता है। और CustomPropertyDoozer एक गुण बनाता है जिसमें उपयोगकर्ता सेटिंग्स संग्रहीत होती हैं।



अभ्यास के लिए आगे बढ़ते हैं



अब जब आपको AddIns की व्यवस्था करने का मूल विचार मिल गया है, तो आप अपना स्वयं का प्लगइन लिखने का प्रयास कर सकते हैं। आपको याद दिला दूं कि एक उदाहरण के लिए हम माइक्रोसॉफ्ट मोल्स का उपयोग करने के लिए एक प्लग-इन बनाएंगे। शुरू करने के लिए पहली बात यह है कि SharpDevelop विंडो को देखें और सोचें कि इसमें अपना प्लगइन कहाँ रखा जाए, इसे कैसे लॉन्च और उपयोग किया जाएगा।



हम मूल नहीं होंगे और इसे विजुअल स्टूडियो के साथ सादृश्य द्वारा करेंगे। यदि आपको याद है, तो मोल्स बनाने के लिए आपको प्रोजेक्ट पैनल में, रेफरेंस फ़ोल्डर में वांछित असेंबली का चयन करना होगा। इन विधानसभाओं के संदर्भ मेनू में एक आइटम है "मोल्स असेंबली जोड़ें"।



प्लगइन के लॉन्च के साथ, हमने फैसला किया। अब आपको यह पता लगाने की आवश्यकता है कि किस पथ का उपयोग किया जाना चाहिए। ऐसा करने के लिए, आपको पुस्तकों, मंचों, पुस्तिकाओं में खुद को दफनाने की जरूरत नहीं है। SharpDevelop में एक उत्कृष्ट उपकरण है - AddIn स्काउट (मुख्य मेनू - टूल - AddIn स्काउट), जो AddIn ट्री को फ़ोल्डर ट्री के रूप में दिखाता है।



इस पेड़ के साथ थोड़ा चलने के बाद, हम पाते हैं कि हमें क्या चाहिए:







"" SharpDevelop / Pads / ProjectBrowser / ContextMenu / ReferenceNode "ठीक वैसे ही है जैसे हमें चाहिए। उस पर, मौजूदा संदर्भ मेनू आइटम पहले ही जोड़ दिए गए हैं: ताज़ा करें, निकालें और गुण।



FileName लिंक .addin फ़ाइल के पथ को इंगित करता है जिसमें चयनित एक्सटेंशन को परिभाषित किया गया है। इस मामले में, यह ICSharpCode.SharpDevelop.addin है - मुख्य फ़ाइल जिसमें मुख्य एक्सटेंशन परिभाषित हैं। यह काफी बड़ी है, 2171 लाइनें। यदि आप लिंक पर क्लिक करते हैं, तो यह फ़ाइल अंतर्निहित XML संपादक में खुलेगी।



इस फ़ाइल का संपादन अनुशंसित नहीं है। हम बेहतर तरीके से यह पता लगा लेंगे कि इसमें संदर्भ मेनू आइटम कैसे वर्णित हैं।



< Path name ="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ReferenceNode" >

< MenuItem id ="RefreshReference"

icon ="Icons.16x16.BrowserRefresh"

label ="${res:AddIns.HtmlHelp2.Refresh}"

class ="ICSharpCode.SharpDevelop.Project.Commands.RefreshReference" />

< MenuItem id ="Remove"

label ="${res:Global.RemoveButtonText}"

icon ="Icons.16x16.DeleteIcon"

class ="ICSharpCode.SharpDevelop.Project.Commands.DeleteProjectBrowserNode" />

< MenuItem id ="RemoveSeparator" type ="Separator" />

< MenuItem id ="Properties"

icon ="Icons.16x16.PropertiesIcon"

label ="${res:XML.MainMenu.FormatMenu.ShowProperties}"

class ="ICSharpCode.SharpDevelop.Project.Commands.ShowPropertiesForNode" />

</ Path >






अंत में, आप सबसे दिलचस्प - एक प्लगइन लिखने पर आगे बढ़ सकते हैं। सबसे पहले आपको बाइनरी फॉर्म में SharpDevelop के नवीनतम संस्करण को डाउनलोड करने और इसे स्थापित करने की आवश्यकता है। हमें इसके स्रोतों की भी आवश्यकता होगी। यह सब यहां पाया जा सकता है (स्थिर संस्करण) या यहां (बिल्ड सर्वर)। मैं बिल्ड सर्वर के साथ लिया।



सूत्रों को पहले संकलित किया जाना चाहिए। ऐसा करने के लिए, किट के साथ आने वाली debugbuild.bat फ़ाइल का उपयोग करना बेहतर है। "हमें शार्पडेवलप के दो संस्करणों की आवश्यकता क्यों है?" आप पूछते हैं। तथ्य यह है कि जब डिबग संस्करण लॉन्च किया जाता है, तो मुख्य विंडो के अलावा, कंसोल भी शुरू होता है, जिसमें आप लॉग देख सकते हैं। विशेष रूप से, कोई यह देख सकता है कि कब और कौन सी असेंबली लोड की गई हैं।



अब आप मुख्य SharpDevelop को खोल सकते हैं और एक नया प्रोजेक्ट "SharpDevelop addin" बना सकते हैं, जो "C # / SharpDevelop" अनुभाग में स्थित है। चलो इसे MolesAddIn कहते हैं। टेम्पलेट में दो फ़ाइलें हैं: AddInWritingHelp.txt और MolesAddIn.addin। पहले प्लगइन्स लिखने और कुछ लिंक के लिए कुछ युक्तियां शामिल हैं। इसे सुरक्षित रूप से हटाया जा सकता है। दूसरे में हमारे प्लगइन का विवरण होगा।



< AddIn name ="MolesAddIn"

author ="OpenMinded"

copyright ="GNU Lesser General Public License Version 2.1"

url =""

description ="Adds support for Microsoft Moles to the projects browser" >



< Runtime >

< Import assembly ="MolesAddIn.dll" />

</ Runtime >



< Manifest >

< Identity name ="OpenMinded.MolesAddIn" version ="@MolesAddIn.dll" />

< Dependency addin ="SharpDevelop" version ="4.0" />

</ Manifest >



< Path name ="/SharpDevelop/Pads/ProjectBrowser/ContextMenu/ReferenceNode" >

< MenuItem id ="AddMolesAssembly"

label ="Add Moles Assembly"

class ="OpenMinded.MolesAddIn.AddMolesCommand" />

</ Path >



</ AddIn >






रनटाइम टैग में, आपको उन सभी असेंबलीज़ को लगाना चाहिए जो आपके एक्सटेंशन के काम करने के लिए आवश्यक होंगी। इस मामले में, यह हमारी परियोजना की विधानसभा है। पहचान उस एक्सटेंशन का नाम है जिसे AddIn Manager में प्रदर्शित किया जाएगा (मुख्य मेनू उपकरण है - AddIn Manager)। प्रत्येक एक्सटेंशन की एक पहचान होनी चाहिए, और नाम अद्वितीय होना चाहिए। एक संस्करण के रूप में, आप या तो स्पष्ट रूप से एक संस्करण निर्दिष्ट कर सकते हैं, उदाहरण के लिए 1.0.0, या विधानसभा संस्करण का उपयोग करें, जैसा कि ऊपर किया गया है।



निर्भरता वे एक्सटेंशन हैं जो आपके AddIn के काम करने के लिए आवश्यक हैं। कई हो सकते हैं। SharpDevelop वह मुख्य एक्सटेंशन है जिसमें प्रोजेक्ट ब्राउज़र सहित हर वह चीज़ शामिल है जिसकी हमें ज़रूरत है। इसलिए, यह निर्भरता सभी AddIns के लिए अनिवार्य है।



पथ - वह पथ जिसके साथ हमने मेनू आइटम जोड़ा। एक फ़ाइल में कई पथ हो सकते हैं, जैसा कि ICSharpCode.SharpDevelop.addin में है। इसके अलावा, प्रत्येक मेनू आइटम में नेस्टेड मेनू आइटम हो सकते हैं। वर्ग विशेषता में उस वर्ग का नाम होता है जो मेनू आइटम पर क्लिक को संभालने के लिए जिम्मेदार होता है। MenuItem के लिए, इस वर्ग को IMenuCommand इंटरफ़ेस या AbstractMenuCommand सार क्लास इनहेरिट करना होगा।



हम अपनी परियोजना के लिए दो लिंक जोड़ते हैं: ICSharpCode.Core.dll और ICSharpCode.SharpDevelop.dll। आपके द्वारा स्रोतों को संकलित करने के बाद वे / पथ / / से / शार्पवार्ड-स्रोत / बिन में पाए जा सकते हैं। लिंक के लिए, आपको कॉपी टू लोकल प्रॉपर्टी को फाल्स में सेट करना होगा, क्योंकि हमारा एक्सटेंशन शार्पडेवल लॉन्च करेगा। अब आप AddMolesCommand वर्ग जोड़ सकते हैं।



using System;

using System.Windows.Forms;

using ICSharpCode.Core;

using ICSharpCode.SharpDevelop.Project;



namespace OpenMinded.MolesAddIn

{

public class AddMolesCommand : AbstractMenuCommand

{

public override void Run()

{

// References

ReferenceNode node = Owner as ReferenceNode;

if (node != null )

{

// ,

ReferenceProjectItem item = node.ReferenceProjectItem;

if (item != null ) {

string fileName = item.FileName;



MessageBox.Show(fileName);

}

}

}

}

}






अभी तक टीम कुछ भी उपयोगी नहीं कर रही है। हमें बस असेंबली में प्रवेश मिला, जिसके द्वारा हमने राइट-क्लिक किया और इसका फ़ाइल नाम सीखा।



विस्तार शुरू करने के लिए, आपको मोल्सएडइन प्रोजेक्ट के गुणों को थोड़ा संशोधित करना होगा। पहली बात यह है कि पथ को बदल दें जहां समाप्त एक्सटेंशन की प्रतिलिपि बनाई जाएगी ताकि शार्पडेवल इसे स्वचालित रूप से शुरू करे। इसके लिए एक विशेष AddIns फ़ोल्डर है। हमारे एक्सटेंशन के नाम के साथ इसमें एक सबफ़ोल्डर बनाएं।



इसलिए, आउटपुट पाथ को "/ path / to / sharpdevelop-source / AddIns / MolesAddIn" पर सेट किया जाना चाहिए।







जब आप F5 दबाते हैं तो SharpDevelop का डिबग संस्करण शुरू करने के लिए, आपको प्रोजेक्ट गुणों में लॉन्च विधि को बदलने की आवश्यकता होती है।







अब सब कुछ तैयार है। Ctrl + F5 - और हमने पहले ही दूसरा SharpDevelop लॉन्च किया है। इसमें MolesAddIn प्रोजेक्ट खोलें और इसके किसी भी लिंक पर राइट-क्लिक करें।







मेनू गुण "एड मोल्स असेंबली" को "गुण" के तुरंत बाद देखा जा सकता है। इस बिंदु पर, MolesAddIn.dll असेंबली अभी लोड नहीं हुई है, आप कंसोल में लॉग देखकर इसे सत्यापित कर सकते हैं। चयनित मेनू आइटम पर क्लिक करने के बाद, एक मैसेज बॉक्स खुलेगा, और लॉग में "Add Add MolesAddIn.dll" लाइन दिखाई देगी।



AddIn Manager (उपकरण - AddIn Manager) में आप हमारे एक्सटेंशन के बारे में एक प्रविष्टि पा सकते हैं: नाम, संस्करण और विवरण। इसे AddIn Scout में भी देखा जा सकता है।



और फिर क्या?



शार्पडेव लुक के लिए यह विस्तार विकास है। एक बार AddIn पर्याप्त स्थिर हो जाने के बाद, यह आपके IDE के कार्यशील संस्करण में इंस्टॉलेशन के लिए तैयार किया जा सकता है। यह बस किया जाता है - इसके संचालन के लिए आवश्यक सभी असेंबली (हमारे मामले में, एक - MolesAddIn.dll) के साथ * .addin फ़ाइल ज़िप संग्रह में पैक की जाती है। इसके अलावा, इस संग्रह का नाम बदलकर * .sadaddin रखा गया है। सब कुछ, स्थापना पैकेज तैयार है। AddIn Manager का उपयोग करके, आप SharpDevelop को स्थापित कर सकते हैं।



बेशक, AddIns प्रणाली का यह वर्णन पूर्ण से बहुत दूर है। यह केवल एक सामान्य विचार देता है और डेवलपर द्वारा प्लगइन्स के लेखन को देखने में मदद करता है।



अधिक संपूर्ण विवरण के लिए, C # एप्लिकेशन को विघटित करना देखें: शार्पडेव्यूअर के अंदर । डिजिटल रूप में, इसे मुफ्त में डाउनलोड किया जा सकता है। जब से यह सामने आया, वास्तुकला में कोई बड़ा बदलाव नहीं हुआ है, मुख्य रूप से इसका नाम बदल रहा है। उदाहरण के लिए, पुस्तक में पाथ को एक्सटेंशन, और डूज़र - कोडन कहा जाता है। शार्पव्यूड डिस्ट्रीब्यूशन में अधिक अप-टू-डेट जानकारी डॉक / टेक्नोट्स फोल्डर में पाई जा सकती है।



PS किसी कारण से, स्रोत टैग मेरे लिए काम करने से इनकार कर देता है।



All Articles