2010-05-17 115 views
0

我试图运行下面的代码(我从here得到)。该代码只是在Visual Studio中创建一个新的“输出”窗格并向其写入几行内容。从控制台应用程序自动化Visual Studio 2010

Public Sub WriteToMyNewPane() 
    Dim win As Window = _ 
     dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) 
    Dim ow As OutputWindow = win.Object 
    Dim owPane As OutputWindowPane 
    Dim cnt As Integer = ow.OutputWindowPanes.Count 
    owPane = ow.OutputWindowPanes.Add("My New Output Pane") 
    owPane.Activate() 
    owPane.OutputString("My text1" & vbCrLf) 
    owPane.OutputString("My text2" & vbCrLf) 
    owPane.OutputString("My text3" & vbCrLf) 
End Sub 

而不是运行它作为一个宏观的,我要运行它连接到Visual Studio 2010中我有一个很难搞清楚如何设置的当前运行的实例一个独立的控制台应用程序值为dte。我想我可能需要调用GetActiveObject,但我不知道如何。任何指针?

+0

这似乎是一个非常不寻常的要求。你想达到什么目的?假设它甚至是可能的,这将如何与VS 2010的两个或更多运行实例一起工作? 如果你真的需要VS与外部操作系统进程进行通信,请考虑编写一个自定义扩展,它使用命名管道,WCF,原始套接字等与另一个进程进行交互。 – 2010-05-17 18:24:21

+0

@Simon,我想你是误解......我不希望VS与另一个进程通信...我想要一个控制台应用程序(一个非常简单的)与当前正在运行的VS实例进行通信。这似乎是自动化正在运行的应用程序的一个非常标准的情况(在这种情况下,应用程序是Visual Studio) – JoelFan 2010-05-17 18:27:35

+0

VS <> ConsoleApp通信可以在任何方向。我仍然认为使用VS扩展通过(例如)WCF监听来自其他进程的命令将是一条路。 VS扩展可以完全访问Visual Studio 2010 SDK,并且使用托管代码而不是VBScript编写。此外,您还可以将其他功能构建到扩展中,例如安全性和活动日志记录。 – 2010-05-17 19:52:24

回答

2

是的,这是有些可能的,DTE接口支持进程外激活。以下是显示该方法的示例代码:

Imports EnvDTE 

Module Module1 
    Sub Main() 
     Dim dte As DTE = DirectCast(Interaction.CreateObject("VisualStudio.DTE.10.0"), EnvDTE.DTE) 
     dte.SuppressUI = False 
     dte.MainWindow.Visible = True 
     Dim win As Window = dte.Windows.Item(Constants.vsWindowKindOutput) 
     Dim ow As OutputWindow = DirectCast(win.Object, OutputWindow) 
     Dim owPane As OutputWindowPane = ow.OutputWindowPanes.Add("My New Output Pane") 
     owPane.Activate() 
     owPane.OutputString("My text1" & vbCrLf) 
     owPane.OutputString("My text2" & vbCrLf) 
     owPane.OutputString("My text3" & vbCrLf) 
     Console.WriteLine("Press enter to terminate visual studio") 
     Console.ReadLine() 
    End Sub 
End Module 

上一条语句显示为什么这不太实际。只要程序停止运行,coclass上的最后一个引用计数就会消失,从而使Visual Studio退出。

+0

我可以获取当前运行的实例而不是启动一个新的实例吗? – JoelFan 2010-05-17 19:37:19

+0

@Joel:如果有两个或更多VS实例会怎么样 - 上面的VBScript会如何选择? – 2010-05-17 19:44:29

+0

@Joel:你不能,你只能创建一个新的实例。标准的COM服务器实践。某些服务器在ROT中发布类工厂,但Visual Studio不会。 – 2010-05-17 19:50:07

相关问题