我正在写一个自定义的工具,我现在有它做什么,我想尽可能的功能。 我想可以,如果出现错误编写到Visual Studio。 (格式不正确的代码或其他)。
有没有这方面的任何标准? 现在我基本上可以强制工具失败和Visual Studio放在一个警告,它已经这样做了。 我想在输出窗口的类别与我想给任何产生的消息。 我也可以生活在一个更具描述性的任务/在错误列表窗口警告。
我正在写一个自定义的工具,我现在有它做什么,我想尽可能的功能。 我想可以,如果出现错误编写到Visual Studio。 (格式不正确的代码或其他)。
有没有这方面的任何标准? 现在我基本上可以强制工具失败和Visual Studio放在一个警告,它已经这样做了。 我想在输出窗口的类别与我想给任何产生的消息。 我也可以生活在一个更具描述性的任务/在错误列表窗口警告。
要写入在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);
...
}
...
}
细节GeneratorError()可以在MSDN上找到。
还有用另一种方式Marshal.GetActiveObject
抢跑DTE2
实例。
第一参考EnvDTE和envdte80。 这目前是在2012年的VisualStudio,我没有尝试过其他人呢。
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;
}
}
如果你想要的任何东西出现在输出窗口,它必须来自标准输出。 要做到这一点,您的应用程序需要链接为“控制台”的应用程序。 设置/子系统:CONSOLE标志项目的属性页面,链接下/系统设置子系统属性控制台。
一旦你有你的输出窗口,如果包含文本“错误:”它会出现一个错误,或者如果你设置“警告:”这将显示为警告。 如果你的错误的文字与路径/文件名,然后在括号行号开始,IDE将其识别为“点击”的错误,并自动导航您的断层线。
您可以使用调试和/或跟踪类。 这里有一些信息: http://msdn.microsoft.com/en-us/library/bs4c1wda(VS.71).aspx
祝您好运。
使用System.Diagnostics.Debugger.Message