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