web-dev-qa-db-ja.com

カスタムツールでVisualStudioの出力ウィンドウに書き込むにはどうすればよいですか?

私はカスタムツールを書いていますが、現在、機能に関してはやりたいことをやっています。何か問題が発生した場合にVisualStudioに書き込めるようにしたいと思います。 (誤ってフォーマットされたコードなど)。

これに関する基準はありますか?今のところ、基本的にツールを強制的に失敗させることができ、VisualStudioは失敗したことを警告します。送信したい結果のメッセージを含むカテゴリを[出力]ウィンドウに表示したいのですが。エラーリストウィンドウで、より説明的なタスク/警告を表示することもできます。

34
Jeff Martin

出力ウィンドウ

Visual Studioの「一般」出力ウィンドウに書き込むには、次の手順を実行する必要があります。

_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
_

ただし、カスタムウィンドウに書き込みたい場合は、次のようにする必要があります。

_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
_

IVsOutputWindow および IVsOutputWindowPane の詳細については、MSDNを参照してください。

エラーリスト

エラーリストに項目を追加するために、IVsSingleFileGeneratorにはタイプIVsGeneratorProgressのパラメータを持つメソッド呼び出しvoid Generate(...)があります。このインターフェイスには、エラーと警告をVisualStudioエラーリストに報告できるメソッドvoid GeneratorError()があります。

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

GeneratorError() の詳細は、MSDNにあります。

60
Alex

Marshal.GetActiveObjectを使用して実行中のDTE2インスタンスを取得する別の方法があります。

最初にEnvDTEおよびenvdte80を参照します。これは現在VisualStudio2012で機能しますが、他のものはまだ試していません。

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;
    }
}
9
Ian Davis

出力ウィンドウに何かを表示したい場合は、stdoutから取得する必要があります。これを行うには、アプリを「コンソール」アプリとしてリンクする必要があります。プロジェクトのプロパティページで/ SUBSYSTEM:CONSOLEフラグを設定し、[リンカー/システム]で[SubSystem]プロパティを[CONSOLE]に設定します。

ウィンドウに出力が表示されたら、「エラー:」というテキストを含めるとエラーとして表示され、「警告:」を設定すると警告として表示されます。エラーテキストがパス/ファイル名で始まり、その後に括弧内の行番号が続く場合、IDEはそれを「クリック可能な」エラーとして認識し、自動的にエラー行に移動します。

4
John Deters

DebugクラスやTraceクラスを使用できます。ここにいくつかの情報があります: http://msdn.Microsoft.com/en-us/library/bs4c1wda(VS.71).aspx

幸運を祈ります。

0
Jon Onstott