2010-05-10 14 views
10

मैं एक वीएस ऐड-इन लिख रहा हूं और मुझे सफल निर्माण के बाद एक निश्चित विधि चलाने की आवश्यकता है। मैंने dte.Events.BuildEvents.OnBuildDone का उपयोग करने का प्रयास किया है लेकिन यह घटना तब भी होती है जब निर्माण विफल हो।सफल निर्माण समाप्त होने पर अधिसूचना कैसे प्राप्त करें?

क्या कोई संपत्ति या कोई अन्य घटना है जिसका उपयोग मुझे करना चाहिए?

उत्तर

13

ऑनबिल्डडोन घटना आपको बता नहीं सकती कि क्या हुआ। समाधान में कुछ परियोजनाएं ठीक तरह से बनाई गई हैं, कुछ नहीं। इसके बजाय आपको OnBuildProjConfigDone की आवश्यकता होगी। प्रत्येक परियोजना के लिए आग, सफलता तर्क आपको बताता है कि यह काम करता है या नहीं।

+0

मेरे मामले में ऑनबिल्डडोन कभी नहीं निकाल दिया गया, लेकिन OnBuildProjConfigDone ठीक काम किया –

+0

@DinisCruz कभी-कभी OnBuildDone आग नहीं करता है यदि आप dte.Events के संदर्भ में नहीं हैं।BuildEvents – Artiom

+1

यहां एक पूर्ण कोड नमूना है कि इसे यहां कैसे करें: https://github.com/edsykes/VisualStudioBuildEvents –

6

आमतौर पर, आपको कई परियोजनाओं को बनाए रखने की आवश्यकता होती है। यह एक समाधान निर्माण, या एक परियोजना का निर्माण हो सकता है जो किसी अन्य परियोजना पर निर्भर है।

तो, यह पता लगाने के लिए जब एक सफल बनाने के समाप्त हो गया है, तो आप दो निर्माण की घटनाओं के संयोजन का उपयोग करने की आवश्यकता है:

OnBuildProjConfigDone और OnBuildDone।

आपको समग्र निर्माण स्थिति को ट्रैक करने के लिए सदस्य चर की भी आवश्यकता होगी।

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

अंत में, आपके ऑनबिल्डडोन हैंडलर को कॉल किया जाएगा। यहां, आप यह देखने के लिए कि क्या कोई प्रोजेक्ट बिल्ड विफल हुआ है, आप अपने सदस्य चर को देख सकते हैं।

यहां एक विस्तार से कुछ उदाहरण कोड है जिसे मैंने वीएस2012 के लिए लिखा था। एक्सटेंशन एक "कस्टम बिल्ड" कमांड प्रदान करता है जो सक्रिय प्रोजेक्ट बनाता है और बिल्ड सफल होने पर डीबगर लॉन्च करता है।

private bool _overallBuildSuccess; 
private bool _customBuildInProgress; 

private void CustomBuild_MenuItemCallback(object sender, EventArgs e) 
{ 
    // Listen to the necessary build events. 
    DTE2 dte = (DTE2)GetGlobalService(typeof(SDTE)); 
    dte.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone; 
    dte.Events.BuildEvents.OnBuildProjConfigDone += BuildEvents_OnBuildProjConfigDone; 

    try 
    { 
     // Build the active project. 
     _customBuildInProgress = true; 
     dte.ExecuteCommand("Build.BuildSelection"); 
    } 
    catch (COMException) 
    { 
     _customBuildInProgress = false; 
     WriteToOutputWindow("Build", "Could not determine project to build from selection"); 
    } 
} 

private void BuildEvents_OnBuildProjConfigDone(string project, string projectConfig, string platform, string solutionConfig, bool success) 
{ 
    // Ignore this build event if we didn't start it. 
    if (!_customBuildInProgress) 
    { 
     return; 
    } 

    // Keep track of the overall build success. 
    _overallBuildSuccess = success; 
} 

private void BuildEvents_OnBuildDone(EnvDTE.vsBuildScope scope, EnvDTE.vsBuildAction action) 
{ 
    // Ignore this build event if we didn't start it. 
    if (!_customBuildInProgress) 
    { 
     return; 
    } 

    _customBuildInProgress = false; 

    if (_overallBuildSuccess) 
    { 
     // Launch the debugger. 
     DTE2 dte = (DTE2)GetGlobalService(typeof(SDTE)); 
     dte.ExecuteCommand("Debug.Start"); 
    } 
    else 
    { 
     WriteToOutputWindow("Build", "Custom build failed."); 
    } 
} 

private void WriteToOutputWindow(string paneName, string message) 
{ 
    DTE2 dte = (DTE2)GetGlobalService(typeof(SDTE)); 

    Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
    OutputWindow outputWindow = (OutputWindow)window.Object; 

    OutputWindowPane targetPane = outputWindow.OutputWindowPanes.Cast<OutputWindowPane>() 
     .FirstOrDefault(x => x.Name.ToLower() == paneName.ToLower()); 

    if (targetPane == null) 
    { 
     targetPane = outputWindow.OutputWindowPanes.Add(paneName); 
    } 

    targetPane.Activate(); 
    outputWindow.ActivePane.OutputString(message); 
    outputWindow.ActivePane.OutputString(Environment.NewLine); 
} 
+0

"GetGlobalService" क्या है? मैं वीएस -2010 पर हूं, शायद 2012 की विशिष्ट वस्तु? – granadaCoder

+0

GetGlobalService Microsoft.VisualStudio.Shell.Package पर एक विधि है, जो मेरा एक्सटेंशन उपclasses। – ryanman

2

भविष्य के पाठकों के लिए, इस आलेख को देखें।

http://blogs.msdn.com/b/alexpetr/archive/2012/08/14/visual-studio-2012-and-buildevents-in-addins.aspx

और/या

http://support.microsoft.com/kb/555102/en-us

मूल रूप से, वहाँ एक बग हो सकता है। कार्य-आसपास कनेक्ट पर ".BildEvents" के सदस्य चर सेट करना है।

उदाहरण:

private _BuildEvents _buildEvents; 

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 
       { 
       _buildEvents = _applicationObject.Events.BuildEvents; 
       } 

फिर ईवेंट हैंडलर्स

this._buildEvents 

और नहीं

_applicationObject.Events.BuildEvents 

जहां _applicationObject = (EnvDTE.DTE) आवेदन करने के लिए तार;

कम से कम, आईएमएचओ की कोशिश करने लायक है।

+0

शूट करें। अब जब मैंने उपरोक्त लिखा है, तो मुझे एक बहुत अच्छी एसओएफ प्रतिक्रिया मिली। http://stackoverflow.com/questions/14165885/add-in-events-are-never-executed – granadaCoder