Pergunta

Estou escrevendo um suplemento VS e preciso executar um determinado método após uma compilação bem-sucedida. Eu tentei usar dte.Events.BuildEvents.OnBuildDone Mas esse evento acontece mesmo que a construção falhasse.

Existe uma propriedade ou algum outro evento que eu deveria usar?

Foi útil?

Solução

O evento Onbuilddone não pode lhe dizer o que aconteceu. Alguns projetos na solução podem ter construído corretamente, outros não. Você precisará do OnBuildProjconfigDone. Incêndios para cada projeto, o argumento do sucesso diz se funcionou.

Outras dicas

Normalmente, você precisa lidar com vários projetos sendo construídos. Isso pode ser uma solução de solução ou construir um projeto que depende de outro projeto.

Então, para descobrir quando uma construção bem -sucedida terminou, você precisa usar uma combinação dos dois eventos de construção:

OnBuildProjconfigDone e Onbuilddone.

Você também precisará de uma variável de membro para rastrear o status geral de construção.

Seu manipulador OnBuildProjConfigDone será chamado para cada projeto que é construído e é aprovado em um bool para dizer se essa construção do projeto foi bem -sucedida. Atribua esse resultado à sua variável de membro para acompanhar o status geral.

Finalmente, seu manipulador Onbuilddone será chamado. Aqui, você pode olhar para a variável do seu membro para verificar se algum projeto de compilação falhou.

Aqui está algum código de exemplo de uma extensão que escrevi para o VS2012. A extensão fornece um comando "Construção personalizada" que cria o projeto ativo e lança o depurador se a construção foi bem -sucedida.

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

Para futuros leitores, confira este artigo.

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

e/ou

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

Basicamente, pode haver um bug. O trabalho é definir uma variável de membro dos ".BuilDevents" no Connect.

Exemplo:

private _BuildEvents _buildEvents;

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

Em seguida, conecte os manipuladores de eventos para

this._buildEvents

e não

_applicationObject.Events.BuildEvents

onde _applicationObject = (Envdte.dte) aplicativo;

Vale a pena tentar pelo menos, IMHO.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top