Jak napisać do okna wyjściowego programu Visual Studio w moim narzędziu niestandardowym?

Piszę niestandardowe narzędzie i obecnie robię to, co chcę, jeśli chodzi o funkcjonalność. Chciałbym móc pisać do Visual Studio, jeśli coś pójdzie nie tak. (Nieprawidłowo sformatowany kod lub cokolwiek innego).

Czy są na to jakieś standardy? W tej chwili w zasadzie mogę zmusić narzędzie do niepowodzenia i Visual Studio umieszcza ostrzeżenie, że tak się stało. Chciałbym mieć kategorię w oknie wyjściowym z wszelkimi wynikowymi wiadomościami, które chcę wysłać. Mógłbym też żyć z bardziej opisowe zadanie / ostrzeżenie w oknie listy błędów.

Author: John Saunders, 2009-07-07

5 answers

Okno Wyjścia

Aby napisać do okna wyjściowego" Ogólne " w Visual Studio, musisz wykonać następujące czynności:

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

Jeśli jednak chcesz napisać do niestandardowego okna, oto co musisz zrobić:

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

Szczegóły dotyczące Ivsoutputwindowpane i IVsOutputWindowPane można znaleźć na MSDN.

Lista Błędów

Do dodawania elementów do listy błędów, IVsSingleFileGenerator posiada wywołanie metody void Generate(...), która ma parametr typu IVsGeneratorProgress. Interfejs ten ma metoda void GeneratorError(), która pozwala zgłaszać błędy i ostrzeżenia do listy błędów programu 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);
        ...
    }
    ...
}

Szczegóły GeneratorError () można znaleźć na MSDN.

 49
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-05 16:57:51

Istnieje inny sposób użycia Marshal.GetActiveObject do przechwycenia uruchomionej instancji DTE2.

Pierwsze odniesienia EnvDTE i envdte80. To obecnie działa w VisualStudio 2012, nie próbowałem jeszcze innych.

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
Author: Ian Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-30 19:01:57

Jeśli chcesz, aby cokolwiek pojawiło się w oknie wyjściowym, musi pochodzić ze standardowego wyjścia. Aby to zrobić, Twoja aplikacja musi być połączona jako aplikacja "konsolowa". Ustaw flagę/SUBSYSTEM:CONSOLE na stronie Właściwości projektu, w obszarze Linker / System ustaw właściwość podsystemu na CONSOLE.

Po wyświetleniu danych wyjściowych w oknie, jeśli dodasz tekst " Error:", pojawi się on jako błąd, lub jeśli ustawisz " Warning:", pojawi się jako ostrzeżenie. Jeśli tekst błędu zaczyna się od ścieżki / nazwy pliku, a następnie po numerze linii w nawiasie IDE rozpoznaje go jako błąd "klikalny" i automatycznie nawiguje do linii błędu.

 4
Author: John Deters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-07 21:46:31

Możesz użyć klas Debug i / lub Trace. Jest tu kilka informacji: http://msdn.microsoft.com/en-us/library/bs4c1wda (VS. 71). aspx

Powodzenia.

 0
Author: Jon Onstott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-07 19:42:04

Użyj System.Diagnostics.Debugger.Message

 -2
Author: David Egli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-09 20:08:07