C# 使用Process.Start()的外部程序启动代码时的调试

C# 使用Process.Start()的外部程序启动代码时的调试,c#,debugging,process.start,external-process,C#,Debugging,Process.start,External Process,假设我有一个C#WinForms应用程序,它是由外部程序通过使用Process.Start(MyModule.exe)启动的 我试图通过使用我的项目属性->调试->启动操作->启动外部程序来调试代码(当然要设置正确的工作目录) 我的另一次尝试是调试->附加到进程 更新:我的模块和外部程序都使用一个资源。所以外部程序释放它,然后调用Process.Start(),等待我的进程退出ans,然后再次捕获资源。因此,当您的程序已经运行时,我无法附加 两个都失败了-程序中的断点从未命中 那么,在这种情况下

假设我有一个C#WinForms应用程序,它是由外部程序通过使用
Process.Start(MyModule.exe)
启动的

我试图通过使用我的项目属性->调试->启动操作->启动外部程序来调试代码(当然要设置正确的工作目录

我的另一次尝试是调试
->附加到进程

更新:我的模块和外部程序都使用一个资源。所以外部程序释放它,然后调用Process.Start(),等待我的进程退出ans,然后再次捕获资源。因此,当您的程序已经运行时,我无法附加

两个都失败了-程序中的断点从未命中


那么,在这种情况下如何调试代码呢?

有两种不同的方法可以使用
System.Diagnostics.Debugger.Launch()
System.Diagnostics.Debugger.Break()
第一种方法将附加一个调试器(让您选择哪个),然后什么也不做。如果已经连接了一个,则不会发生任何事情。 在没有附加调试器的情况下,后者将完全像
Launch
,如果附加了调试器,则将作为断点

所以只需编写
System.Diagnostics.Debugger.Break()您希望断点位于的位置

这将导致一个对话框,询问您希望如何调试程序(当然这也意味着您应该在调试完成后删除该行)


在对话框中选择适当的VS实例(或创建一个新实例),然后按常规继续调试

我知道有两种方法可以轻松解决此问题。第一种方法是让程序请求一个调试器附加到它,就像它在Main via中做的第一件事一样

这将显示如下对话框

这将允许您连接到正在运行的visual studio或启动新实例

当您不能使用前面的方法(例如,我认为它在服务内部不起作用)时,另一种解决方法是在代码的开头放置一个循环,该循环将一直循环,直到附加了调试器,这使您有足够的时间执行您先前尝试的“附加到进程”方法,而不会让程序继续运行

public static void Main(string[] args)
{
    while(!Debugger.IsAttached)
    {
        Thread.Sleep(1000); //Sleep 1 second and then check again.
    }

    //Rest of your code here
}

我认为,如果在程序已经运行时进行附加,则附加到进程应该可以工作。您是附加到应用程序还是附加到启动它的其他程序?我附加到外部程序。我已经更新了我的帖子以获取一些信息是正确的语法,但对我不起作用什么不起作用?程序版本是发布版本还是调试版本?调试。我尝试了启动外部程序的方法-在单击外部程序中的相应按钮后,我的模块将简单地打开..只需启动调用
进程的程序。出于我的兴趣,启动(…)
:是Debugger.Launch()还是Debugger.IsAttached()仅当代码在调试配置中编译时才处于活动状态?@this.imf这两种方法都在发布模式下处于活动状态,而非
Debugger
中的某些函数在发布期间不会编译。这是通过属性完成的,如果右键单击该方法并执行
导航到->元数据
,您可以看到您想知道的方法是否具有
[条件(“调试”)]
属性。@Scott Chamberlain:谢谢您的解释!
public static void Main(string[] args)
{
    while(!Debugger.IsAttached)
    {
        Thread.Sleep(1000); //Sleep 1 second and then check again.
    }

    //Rest of your code here
}