如何以编程方式启动 Visual Studio 并将其发送到特定文件/行?
Posted
技术标签:
【中文标题】如何以编程方式启动 Visual Studio 并将其发送到特定文件/行?【英文标题】:How can I programmatically launch visual studio and send it to a specific file / line? 【发布时间】:2011-03-08 04:11:06 【问题描述】:我有 a nice tidy way of capturing unhandled exceptions 向我的用户显示并且(可选)通过电子邮件发送给我自己。它们通常看起来像这样:
Uncaught exception encountered in MyApp (Version 1.1.0)!
Exception:
Object reference not set to an instance of an object.
Exception type:
System.NullReferenceException
Source:
MyApp
Stack trace:
at SomeLibrary.DoMoreStuff() in c:\projects\myapp\somelibrary.h:line 509
at SomeAlgothim.DoStuff() in c:\projects\myapp\somealgorithm.h:line 519
at MyApp.MainForm.ItemCheckedEventHandler(Object sender, ItemCheckedEventArgs e) in c:\projects\myapp\mainform.cpp:line 106
at System.Windows.Forms.ListView.OnItemChecked(ItemCheckedEventArgs e)
at System.Windows.Forms.ListView.WmReflectNotify(Message& m)
at System.Windows.Forms.ListView.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
是否可以启动 Visual Studio 并在违规行上打开 c:\projects\myapp\somelibrary.h
,如果可以,如何操作?
如果可能的话,我还想从我生成的 (html) 电子邮件中执行此操作?
【问题讨论】:
我确信您可以使用一些自动化的好东西,甚至是宏,但我不知道如何使用。 您最好在实际的部署环境中尝试一下。你不会有行号。 @Hans Passant:他可以给自己邮寄堆栈跟踪并向用户显示友好的消息。 @egrunin:明白,这会奏效。但他不会有行号,这应该会严重影响问题。 了解汉斯很有用。有什么方法可以保留行号信息,还是只有从 Visual Studio 启动时才存在? 【参考方案1】:您可以自动化 Visual Studio,例如使用 VBScript:
filename = Wscript.Arguments(0)
lineNo = Wscript.Arguments(1)
' Creates an instance of the Visual Studio IDE.
Set dte = CreateObject("VisualStudio.DTE")
' Make it visible and keep it open after we finish this script.
dte.MainWindow.Visible = True
dte.UserControl = True
' Open file and move to specified line.
dte.ItemOperations.OpenFile(filename)
dte.ActiveDocument.Selection.GotoLine (lineNo)
将其保存为 debugger.vbs
并运行它,将文件名和行号作为命令行参数传递:
debugger.vbs c:\dev\my_file.cpp 42
【讨论】:
【参考方案2】:由于您的问题被标记为 C++,因此这里有一些该语言的代码来实现这一点;与乔恩的答案基本相同,但更多文字..
bool OpenFileInVisualStudio( const char* psFile, const unsigned nLine )
CLSID clsid;
if( FAILED( ::CLSIDFromProgID( L"VisualStudio.DTE", &clsid ) ) )
return false;
CComPtr<IUnknown> punk;
if( FAILED( ::GetActiveObject( clsid, NULL, &punk ) ) )
return false;
CComPtr<EnvDTE::_DTE> DTE = punk;
CComPtr<EnvDTE::ItemOperations> item_ops;
if( FAILED( DTE->get_ItemOperations( &item_ops ) ) )
return false;
CComBSTR bstrFileName( psFile );
CComBSTR bstrKind( EnvDTE::vsViewKindTextView );
CComPtr<EnvDTE::Window> window;
if( FAILED( item_ops->OpenFile( bstrFileName, bstrKind, &window ) ) )
return false;
CComPtr<EnvDTE::Document> doc;
if( FAILED( DTE->get_ActiveDocument( &doc ) ) )
return false;
CComPtr<IDispatch> selection_dispatch;
if( FAILED( doc->get_Selection( &selection_dispatch ) ) )
return false;
CComPtr<EnvDTE::TextSelection> selection;
if( FAILED( selection_dispatch->QueryInterface( &selection ) ) )
return false;
return !FAILED( selection->GotoLine( Line, TRUE ) ) );
【讨论】:
以上是关于如何以编程方式启动 Visual Studio 并将其发送到特定文件/行?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查以编程方式安装的 Visual Studio 的版本/版本?
以编程方式创建 pro 时如何在 Visual Studio 中查看资源文件内容