2015-08-21 6 views
7

का उपयोग करके प्रोग्रामिंग रूप से विशिष्ट प्रोजेक्ट को डिबग करना प्रारंभ करें। मेरे पास एकाधिक स्टार्ट-अप प्रोजेक्ट्स का समाधान है, और मैं एक ही डीबगर से जुड़ी नई प्रक्रिया को ध्यान में रखते हुए, उनमें से एक को रात के आधार पर स्वचालित रूप से फिर से लॉन्च करने का प्रयास कर रहा हूं।EnvDTE.ExecuteCommand

मैं प्रक्रिया को पुनरारंभ करने में सक्षम था (Process.Start का उपयोग करके) और वर्तमान डीबगर को संलग्न करें, लेकिन यह अब तक बहुत विश्वसनीय नहीं है, और डिज़ाइन द्वारा, स्टॉप बटन पर क्लिक करने से केवल प्रक्रिया से अलग हो जाता है यह।

मुझे पता है कि विजुअल स्टूडियो टीम ने Visual Studio extension जारी किया है जो automatically attaching child processes to the current debugger को अनुमति देता है, जो मेरे कोड से बेहतर काम कर सकता है, लेकिन यह पोर्टेबल नहीं होगा क्योंकि इसे स्थानीय कॉन्फ़िगरेशन की आवश्यकता है।

प्राप्त करने के लिए मैं क्या जरूरत है, प्रोग्राम के रूप में आईडीई खुद का उपयोग कर परियोजना को पुन: लॉन्च करने लगता है के रूप में मैं मैन्युअल रूप से परियोजना पर राइट क्लिक करें और डीबग का चयन करके करना होगा सबसे आसान तरीका है> नई उदाहरण शुरू करो। मेरे पास मेरे कोड (जब विकास में) में प्रासंगिक डीटीई ऑब्जेक्ट तक पहुंच है।

इसलिए, क्या निम्नलिखित छद्म कोड कोड बनाने का कोई तरीका है, विजुअल स्टूडियो को विशिष्ट प्रोजेक्ट/exe को कमांड तर्क के रूप में पास करके डीबग करना शुरू करने के लिए कह रहा है?

DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance", "ProjectToBeRestarted"); 

DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted"); 

DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted.exe"); 

मैं (, मूल स्टार्ट-अप परियोजनाओं के भंडारण के लिए एक नया एक की स्थापना, और स्टार्ट-अप परियोजनाओं को बहाल करने की तरह) यूआई से छेड़छाड़ जितना संभव हो उतना से बचने के लिए चाहते हैं।

+0

यह भी देखें: http://stackoverflow.com/questions/96250/can-i-create-a-visual-studio-macro-to-launch-a-specific-project-in-the-debugger/32282888# 32282888 –

उत्तर

4

आप जिस समस्या का सामना कर रहे हैं वह बहुत कम दृश्य स्टूडियो कमांड हैं जो इनपुट के रूप में तर्क स्वीकार करते हैं। यह समझ में आता है कि आदेशों पर आम तौर पर वर्तमान आईडीई संदर्भ (जैसे चयन, देखभाल स्थिति, आदि) का उपयोग करने के लिए वास्तव में क्या किया जाना चाहिए। उदाहरण के लिए, ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance कमांड सॉल्यूशन एक्सप्लोरर में वर्तमान में चयनित आइटम पर निर्भर करता है यह जानने के लिए कि कौन सी प्रोजेक्ट डीबगिंग शुरू करने के लिए है, और यह एक तर्क स्वीकार नहीं करता है।

संदर्भ के लिए, आप दृश्य स्टूडियो आदेशों यहाँ तर्क को स्वीकार करने की पूरी सूची प्राप्त कर सकते हैं: https://msdn.microsoft.com/en-us/library/c338aexd.aspx

आपकी समस्या का समाधान करने के लिए आप DTE वस्तु का उपयोग करने के पहले मौजूदा परियोजना के चयन पर सेट करना होगा, और फिर निष्पादित Startnewinstance कमांड।

DTE.ToolWindows.SolutionExplorer.GetItem("SolutionNameHere\\ProjectNameHere").Select(vsUISelectionType.vsUISelectionTypeSelect) 
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance") 

नोट: आपकी प्रोग्रामिंग भाषा के आधार पर, डबल बैकस्लैश से बचने की आवश्यकता हो सकती है या नहीं भी हो सकती है। अंतिम स्ट्रिंग में केवल एक बैकस्लैश होना चाहिए।

+0

वर्कअराउंड के लिए धन्यवाद, यह सही नहीं है क्योंकि समस्या तब उत्पन्न हो सकती है जब उपयोगकर्ता चयन के साथ गड़बड़ कर लेता है, उसी समय कोड आईडी में आता है, लेकिन यह मानक आईडीई कमांड के साथ सबसे अच्छा संभव उत्तर भी हो सकता है (मैं विजुअल की कामना करता हूं स्टूडियो एपीआई अधिक व्यापक था)। –

+1

यदि कोड को सिंक्रनाइज़ किया गया है, तो उपयोगकर्ता को हस्तक्षेप करने के लिए कोई भी समय विंडो नहीं होनी चाहिए। यह वीएस -2010 में मैक्रोज़ के लिए मानक उपयोग पैटर्न था। विकल्प डीटीई के माध्यम से जाना है। इसके बजाय डिबगर मार्ग, जो आपको निम्न-स्तरीय डीबगर 5 इंटरफ़ेस तक पहुंच प्रदान करता है जिससे आप प्रक्रिया शुरू करने के बाद डीबगर को संलग्न करने के लिए प्रोसेस 4 इंटरफ़ेस प्राप्त कर सकते हैं। लेकिन यह आपके मूल प्रश्न (यानी वीएस कमांड) के दायरे से बाहर चला जाता है। – jgg99

+0

वास्तव में जानना अच्छा है। मुझे आपके द्वारा उल्लेख किए गए डीबगर 5 इंटरफ़ेस के वैकल्पिक समाधान में बहुत रूचि है।क्या प्रोग्राम को जोड़ने के बजाय डीबगर ऑब्जेक्ट से प्रोग्राम (एक्सई या प्रोजेक्ट) को डीबग करना शुरू करना संभव है? यहां एक कोड है जिसका उपयोग मैं मौजूदा प्रक्रिया से जुड़ने के लिए कर रहा हूं https://gist.github.com/mayerwin/82301024371e9c555d24। मेरा कोड काम करता है, लेकिन मैं प्रोजेक्ट को डीबगर द्वारा खुद ही वही व्यवहार करने के लिए शुरू करना पसंद करूंगा जैसे कि मैं इसे मैन्युअल रूप से शुरू कर रहा था ("रोकना" और दृश्यमान ब्रेकपॉइंट्स बाधाओं के दौरान अलग होने के बजाए प्रक्रिया को मार डाला गया)। –