Come faccio a scrivere al Visual Studio finestra di output nel mio strumento personalizzato?

StackOverflow https://stackoverflow.com/questions/1094366

  •  11-09-2019
  •  | 
  •  

Domanda

Sto scrivendo uno strumento personalizzato e ho attualmente è fare quello che voglio per quanto riguarda la funzionalità. Mi piacerebbe essere in grado di scrivere a Visual Studio, se qualcosa va storto. (Non correttamente formattato codice o qualsiasi altra cosa).

Ci sono delle norme di questo? In questo momento io fondamentalmente posso forzare lo strumento a fallire e Visual Studio mette in un avvertimento che lo ha fatto. Vorrei una categoria nella finestra di output con eventuali messaggi risultanti voglio mandare. Potrei anche vivere con un compito più descrittiva / avviso nella finestra Elenco errori.

È stato utile?

Soluzione

Finestra di output

Per scrivere alla finestra di uscita "Generale" in Visual Studio, è necessario effettuare le seguenti operazioni:

IVsOutputWindow outWindow = Package.GetGlobalService( typeof( SVsOutputWindow ) ) as IVsOutputWindow;

Guid generalPaneGuid = VSConstants.GUID_OutWindowGeneralPane; // P.S. There's also the GUID_OutWindowDebugPane available.
IVsOutputWindowPane generalPane;
outWindow.GetPane( ref generalPaneGuid , out generalPane );

generalPane.OutputString( "Hello World!" );
generalPane.Activate(); // Brings this pane into view

Se, tuttavia, si desidera scrivere una finestra personalizzata, questo è ciò che devi fare:

IVsOutputWindow outWindow = Package.GetGlobalService( typeof( SVsOutputWindow ) ) as IVsOutputWindow;

// Use e.g. Tools -> Create GUID to make a stable, but unique GUID for your pane.
// Also, in a real project, this should probably be a static constant, and not a local variable
Guid customGuid = new Guid("0F44E2D1-F5FA-4d2d-AB30-22BE8ECD9789");
string customTitle = "Custom Window Title";
outWindow.CreatePane( ref customGuid, customTitle, 1, 1 );

IVsOutputWindowPane customPane;
outWindow.GetPane( ref customGuid, out customPane);

customPane.OutputString( "Hello, Custom World!" );
customPane.Activate(); // Brings this pane into view

I dettagli relativi IVsOutputWindow IVsOutputWindowPane può essere trovato su MSDN.

Elenco errori

Per aggiungere elementi alla lista degli errori, il IVsSingleFileGenerator ha un void Generate(...) chiamata di metodo che ha un parametro del tipo IVsGeneratorProgress. Questa interfaccia ha un metodo void GeneratorError() che consente di segnalare errori e avvisi al Visual Studio lista degli errori.

public class MyCodeGenerator : IVsSingleFileGenerator
{
    ...
    public void Generate( string inputFilePath, string inputFileContents, string defaultNamespace, out IntPtr outputFileContents, out int output, IVsGeneratorProgress generateProgress )
    {
        ...
        generateProgress.GeneratorError( false, 0, "An error occured", 2, 4);
        ...
    }
    ...
}

I dettagli di GeneratorError () può essere trovato su MSDN.

Altri suggerimenti

C'è un altro modo utilizzando Marshal.GetActiveObject per afferrare un'istanza DTE2 in esecuzione.

Prima di riferimento EnvDTE e EnvDTE80. Questo attualmente lavora in VisualStudio 2012, non ho ancora provato gli altri.

using System;
using System.Runtime.InteropServices;
using EnvDTE;
using EnvDTE80;

internal class VsOutputLogger
{
    private static Lazy<Action<string>> _Logger = new Lazy<Action<string>>( () => GetWindow().OutputString );

    private static Action<string> Logger
    {
        get { return _Logger.Value; }
    }

    public static void SetLogger( Action<string> logger )
    {
        _Logger = new Lazy<Action<string>>( () => logger );
    }

    public static void Write( string format, params object[] args)
    {
        var message = string.Format( format, args );
        Write( message );
    }

    public static void Write( string message )
    {
        Logger( message + Environment.NewLine );
    }

    private static OutputWindowPane GetWindow()
    {
        var dte = (DTE2) Marshal.GetActiveObject( "VisualStudio.DTE" );
        return dte.ToolWindows.OutputWindow.ActivePane;
    }
}

Se si desidera qualcosa che appaia nella finestra di output, deve venire da stdout. Per fare questo, la vostra applicazione ha bisogno di essere collegato come applicazione "console". Impostare l'/ SUBSYSTEM:. Bandiera CONSOLE nella pagina delle proprietà del progetto, sotto Linker / set Sistema la proprietà sottosistema CONSOLE

Una volta che avete la vostra uscita nella finestra, se si include il testo "Errore:" apparirà come un errore, o se si imposta "Attenzione:" apparirà come un avvertimento. Se il testo di errore inizia con un percorso / nome del file, seguito da un numero di riga tra parentesi, l'IDE lo riconoscerà come un errore "cliccabile", e si naviga automaticamente alla linea di fagliazione.

È possibile utilizzare il debug e / o Traccia classi. Ci sono alcune informazioni qui: http://msdn.microsoft.com/en-us /library/bs4c1wda(VS.71).aspx

Buona fortuna.

uso System.Diagnostics.Debugger.Message

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top