سؤال

أنا أكتب وظيفة إضافية وأحتاج إلى تشغيل طريقة معينة بعد بناء ناجح. لقد حاولت استخدام dte.Events.BuildEvents.OnBuildDone لكن هذا الحدث يحدث حتى لو فشل البناء.

هل هناك خاصية أو حدث آخر يجب أن أستخدمه؟

هل كانت مفيدة؟

المحلول

لا يمكن أن يخبرك حدث OnBuildDone بما حدث. قد تكون بعض المشاريع في الحل قد بنيت بشكل صحيح ، بعضها لم يفعل. ستحتاج إلى onBuildProjConfigdone بدلاً من ذلك. الحرائق لكل مشروع ، تخبرك حجة النجاح إذا نجحت.

نصائح أخرى

عادة ، تحتاج إلى التعامل مع مشاريع متعددة يتم بناؤها. قد يكون هذا عبارة عن حلول ، أو بناء مشروع يعتمد على مشروع آخر.

لذلك ، لمعرفة وقت الانتهاء من بناء ناجح ، تحتاج إلى استخدام مجموعة من أحداث البناء:

OnBuildProjConfigdone و OnBuildDone.

ستحتاج أيضًا إلى متغير عضو لتتبع حالة البناء الكلية.

سيتم استدعاء معالج OnBuildProjConfigdone الخاص بك لكل مشروع يتم بناؤه ، ويتم تمريره إلى منطق لإخبارك ما إذا كان بناء المشروع هذا ناجحًا. تعيين هذه النتيجة لمتغير العضو الخاص بك لتتبع الحالة الإجمالية.

أخيرًا ، سيتم استدعاء معالج OnBuildDone الخاص بك. هنا ، يمكنك النظر إلى متغير العضو الخاص بك لمعرفة ما إذا كان أي مشروع بناء فشل.

فيما يلي بعض رمز المثال من امتداد كتبته لـ VS2012. يوفر الامتداد أمر "بناء مخصص" يقوم بإنشاء المشروع النشط ويطلق مصحح الأخطاء إذا كان البناء ناجحًا.

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);
}

للقراء في المستقبل ، تحقق من هذا المقال.

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

في الأساس ، يمكن أن يكون هناك خطأ. يتمثل العمل في تعيين متغير عضو في ".buildevents" في Connect.

مثال:

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) التطبيق ؛

الأمر يستحق المحاولة على الأقل ، IMHO.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top