2009-07-07 21 views
27

私はカスタムツールを書いていますが、私は現在、私が望むように機能しています。私は何かがうまくいかない場合、Visual Studioに書きたいと思っています。 (不正な形式のコードなど)。マイカスタムツールでVisual Studio出力ウィンドウに書き込むにはどうすればよいですか?

これに関する基準はありますか?現時点では、基本的にはツールを強制的に失敗させることができ、Visual Studioはこれを行ったという警告を出します。私は送信したいメッセージがあれば、アウトプットウインドウにカテゴリが必要です。私はまた、エラーリストウィンドウにもっとわかりやすいタスク/警告を表示しています。

+0

標準出力への書き込みがなぜ機能しないのですか? – avakar

+0

Console.Writeにメッセージを書き込んでも出力ウィンドウに何も表示されません。 –

答えて

44

出力ウィンドウ

、次の実行する必要があります。

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 

をただし、カスタムウィンドウへの書き込みをしたい、場合は、 IVsOutputWindowIVsOutputWindowPane

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 

詳細はMSDNで見つけることができます。これは、あなたが何をする必要があるかです。エラーリストに項目を追加するための

エラー一覧

IVsSingleFileGeneratorはタイプIVsGeneratorProgressのパラメータを持つメソッド呼び出しvoid Generate(...)を持っています。このインターフェイスには、void GeneratorError()というメソッドがあり、エラーと警告を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); 
     ... 
    } 
    ... 
} 

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

+0

カスタムウィンドウの場合:I(VS2010)がソリューションを使用する場合、何も表示されない素敵なウィンドウペインが表示されます。私が に変更した場合、outWindow.CreatePane(ref customGuid、customTitle、1、0); all is well ...この変更は、ソリューションが閉じられた後にウィンドウが消去されないことを意味し、何が表示されるのかがわからないことがあります。あなたはできる? – BennyBarns

+0

申し訳ありませんが、わかりません。私はVS2008のためにこのことを書きました。その時以来、VSプラグインの開発を実際には扱っていませんでした... – Alex

+0

私の場合、パネルはアクティブ化されていません。 'customPane.Activate();'は動作しません。何か案が? –

0

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

最高の運があります。

+1

私はこれを尋ねる前にtrace.write(メッセージ、カテゴリ)を試みましたが、出力されませんでした。 –

4

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

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

+0

私はこれをC#でやっていますが、プロジェクトプロパティにサブシステムのものはありません。これを行うにはコンソールアプリケーションを作る必要がありますか? DLLとして動作していますが、明らかに出力が得られません。 –

+0

DLLですか?どのように呼び出されていますか?通常、出力ウィンドウはMSBuildが構築するツールチェーン内で実行されるツールをキャプチャしますが、それらがすべて独立した実行ファイルであることを知る限り、MSBuildはすべてのstdoutをキャプチャしてウィンドウに表示します。 カスタムツールがビルドに関連していない可能性があります。 「出力」ウィンドウは、ビルドプロセス用に予約されています。実行時情報を表示する場合は、デバッグウィンドウ(OutputDebugString()またはDebug.Print()など)を使用する必要があります。 –

+2

ありがとう、ジョン。私は幸運にもMSBuildでエラーを作成する方法を発見し、Webを検索して警告を作成する方法を探していました。興味深いことに、あなたの説明は私のために直接働かなかった。私は ":warning:"(引用符なし)を出力して作業するようにしました。 Visual Studioは、警告が特定のファイル/行#に関連付けられている場合、警告テキストからファイル/行番号#情報を区切るために使用される先頭のコロンを欲しかった。何らかの理由で、VS 2008は単に「警告:テキスト」を受け入れません。また、出力ストリームがstdout、stderrなどの場合は問題ありませんでした。また、大文字と小文字が区別されます。ゲシュ。 –

-2

使用System.Diagnostics.Debugger.Message

7

現在DTE2インスタンスをつかむためにMarshal.GetActiveObjectを使用して別の方法があります。

最初の参照EnvDTEとenvdte80。これは現在VisualStudio 2012で動作しますが、私はまだ他のものを試していません。

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; 
    } 
} 
+0

答えはVS2010では私にとっては機能しませんが、これは – smirkingman

+2

ですが、これは動作しますが、複数のVisual Studioインスタンスが開いていると、最初に開いたときにメッセージが表示される可能性があります。 –

関連する問題