Comment puis-je écrire dans la fenêtre de sortie Visual Studio de mon outil personnalisé?

j'écris un outil personnalisé et je l'ai actuellement faire ce que je veux en ce qui concerne la fonctionnalité. J'aimerais pouvoir écrire à Visual Studio si quelque chose tourne mal. (Code mal formaté ou autre).

y a-t-il des normes pour cela? En ce moment, je peux forcer L'outil à échouer et Visual Studio met un avertissement qu'il l'a fait. J'aimerais une catégorie dans la fenêtre de Sortie avec tous les messages que je veux envoyer. Je pourrais aussi vivre avec un plus descriptif de la tâche/l'avertissement dans la fenêtre liste des Erreurs.

29
demandé sur John Saunders 2009-07-07 23:36:56

5 réponses

Fenêtre De Sortie

pour écrire dans la fenêtre de sortie" générale "de Visual Studio, vous devez faire ce qui suit:

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

Si, toutefois, vous souhaitez écrire dans une fenêtre personnalisée, c'est ce que vous devez faire:

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

Détails sur IVsOutputWindow et IVsOutputWindowPane peut être trouvé sur le site MSDN.

Liste D'Erreurs

pour ajouter des éléments à la liste d'erreurs, le IVsSingleFileGenerator a un appel de méthode void Generate(...) qui a un paramètre du type IVsGeneratorProgress . Cette interface a une méthode void GeneratorError() qui vous permet de signaler des erreurs et des avertissements à la liste D'erreurs de Visual Studio.

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

les détails de GeneratorError () peuvent être trouvés sur MSDN.

49
répondu Alex 2009-12-05 16:57:51

il y a une autre façon d'utiliser Marshal.GetActiveObject pour saisir une instance DTE2 .

première référence EnvDTE et envdte80. Cela fonctionne actuellement dans VisualStudio 2012, je n'ai pas encore essayé les autres.

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;
    }
}
7
répondu Ian Davis 2018-04-30 19:01:57

si vous voulez que quelque chose apparaisse dans la fenêtre de sortie, il doit venir de stdout. Pour ce faire, votre application doit être lié à une "console application". Définir le drapeau / SUBSYSTEM:CONSOLE dans la page de propriété du projet, sous Linker/System définir la propriété du sous-système à CONSOLE.

une Fois que vous avez votre sortie dans la fenêtre, si vous incluez le texte "Erreur:" il apparaît comme une erreur, ou si vous réglez "Avertissement:" il apparaît comme un avertissement. Si votre texte d'erreur commence avec un chemin / Nom du fichier, suivi d'un numéro de ligne entre parenthèses, l'IDE le reconnaîtra comme une erreur "cliquable", et vous dirigera automatiquement vers la ligne fautive.

4
répondu John Deters 2009-07-07 21:46:31

vous pouvez utiliser les classes Debug et/ou Trace. Il y a des informations ici: http://msdn.microsoft.com/en-us/library/bs4c1wda (VS.71).aspx

bonne chance.

0
répondu Jon Onstott 2009-07-07 19:42:04

utiliser System.Diagnostics.Debugger.Message

-2
répondu David Egli 2012-04-09 20:08:07