私はカスタムツールを書いていますが、現在、機能に関してはやりたいことをやっています。何か問題が発生した場合にVisualStudioに書き込めるようにしたいと思います。 (誤ってフォーマットされたコードなど)。
これに関する基準はありますか?今のところ、基本的にツールを強制的に失敗させることができ、VisualStudioは失敗したことを警告します。送信したい結果のメッセージを含むカテゴリを[出力]ウィンドウに表示したいのですが。エラーリストウィンドウで、より説明的なタスク/警告を表示することもできます。
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にあります。
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;
}
}
出力ウィンドウに何かを表示したい場合は、stdoutから取得する必要があります。これを行うには、アプリを「コンソール」アプリとしてリンクする必要があります。プロジェクトのプロパティページで/ SUBSYSTEM:CONSOLEフラグを設定し、[リンカー/システム]で[SubSystem]プロパティを[CONSOLE]に設定します。
ウィンドウに出力が表示されたら、「エラー:」というテキストを含めるとエラーとして表示され、「警告:」を設定すると警告として表示されます。エラーテキストがパス/ファイル名で始まり、その後に括弧内の行番号が続く場合、IDEはそれを「クリック可能な」エラーとして認識し、自動的にエラー行に移動します。
DebugクラスやTraceクラスを使用できます。ここにいくつかの情報があります: http://msdn.Microsoft.com/en-us/library/bs4c1wda(VS.71).aspx
幸運を祈ります。