我正在编写一个自定义工具,我目前正在做我想要的功能。如果出现问题,我希望能够写入Visual Studio。 (代码格式不正确或其他)。
这有什么标准吗?现在我基本上可以强制该工具失败,Visual Studio会发出警告,表明它已经这样做了。我想在“输出”窗口中输入一个类别,其中包含我要发送的任何结果消息。我还可以在错误列表窗口中使用更具描述性的任务/警告。
答案 0 :(得分:55)
要在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
有一个方法调用void Generate(...)
,其参数类型为IVsGeneratorProgress
。此接口具有方法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);
...
}
...
}
可以在MSDN上找到GeneratorError()的详细信息。
答案 1 :(得分:8)
还有另一种方法可以使用Marshal.GetActiveObject
来抓取正在运行的DTE2
实例。
首先参考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;
}
}
答案 2 :(得分:4)
如果要在“输出”窗口中显示任何内容,则必须来自stdout。为此,您的应用需要作为“控制台”应用进行关联。在项目的属性页面中设置/ SUBSYSTEM:CONSOLE标志,在Linker / System下将SubSystem属性设置为CONSOLE。
在窗口中显示输出后,如果包含文本“错误:”,则会显示为错误,或者如果设置为“警告:”,则会显示为警告。如果您的错误文本以路径/文件名开头,后跟括号中的行号,则IDE会将其识别为“可单击”错误,并自动导航到错误行。
答案 3 :(得分:0)
您可以使用Debug和/或Trace类。这里有一些信息: http://msdn.microsoft.com/en-us/library/bs4c1wda(VS.71).aspx
祝你好运。
答案 4 :(得分:-2)
使用System.Diagnostics.Debugger.Message