如何调试从外部应用调用的类库?

时间:2012-12-02 19:13:34

标签: c# visual-studio debugging visual-studio-debugging class-library

有一个外部工作流程可以执行C#脚本,并且可以使用DLL文件(我的类库)。

是否可以将调试附加到我的类库项目中,这样一旦这个WF调用它就会遇到断点?

由于

5 个答案:

答案 0 :(得分:25)

是的,您可以使用Visual Studio执行此操作。您有两种选择:

配置项目以启动外部程序

  1. 打开您的DLL项目。

  2. 在项目的属性上,转到调试标签。

  3. 选择启动外部程序,并提供将调用您的DLL的外部程序的路径,以及您可能需要提供的任何命令行参数,以及工作目录(如果是相关的。

  4. 保存项目。

  5. 在代码中设置您想要的断点。

  6. 按F5开始调试。 (此时,您的断点会说它们不会被点击,因为符号未加载。暂时不要担心。)

  7. 执行任何操作,使外部应用程序加载库并运行代码。

  8. Visual Studio将检测模块加载,加载符号,并在断点处停止。

    附加到现有流程

    如果您无法启动该流程,而是必须附加到已经运行的流程,您也可以这样做:

    (旁注:如果你使用的是Visual Studio的“Express”版本,我不会认为它有这个功能,但我不确定。这很容易告诉您:您要么拥有下面步骤4中提到的菜单项,要么没有。)

    1. 确保流程正在运行。

    2. 打开您的DLL项目。

    3. 设置断点等

    4. 调试菜单中,选择附加到流程...

    5. 在结果对话框中,找到列表中的进程,突出显示该进程,然后单击附加

    6. Visual Studio将进入调试模式。 (此时,您的断点会说它们不会被点击,因为符号未加载。暂时不要担心。)

    7. 执行任何操作以加载外部流程并运行代码。

    8. Visual Studio将检测外部进程中的模块加载,加载符号,并在断点处停止。


      NB 在这两种情况下,如果外部进程从项目的bin/Debug文件夹以外的其他位置加载DLL,则必须确保将DLL复制到其他位置< em>每次构建它(您可以将其设置为在项目选项中自动发生)。否则,Visual Studio将无法检测到正在加载的DLL是您尝试调试的DLL。

答案 1 :(得分:2)

您可以使用调试菜单中的附加到处理来调试DLL项目。如果本机代码没有进行调试,则可能需要使用混合模式调试。这可以通过从选择按钮内部出现的窗口中选择托管和本机代码类型来完成。选择按钮在附加到进程窗口中。

如果您使用的Visual Studio版本支持宏,那么您可以使用以下代码创建一个新宏来自动执行所有这些:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module AttachToProcess

    Public Sub DebugMyDLL()
        DTE.ExecuteCommand("Build.BuildSelection")
        Dim ApplicationExePath As String = "C:\Program Files (x86)\foo\bar.exe"
        Shell(ApplicationExePath)
        Try
            Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
            Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
            Dim dbgeng(2) As EnvDTE80.Engine
            dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
            dbgeng(1) = trans.Engines.Item("Native")
            Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "<QualifierName>").Item("bar.exe")
            proc2.Attach2(dbgeng)
        Catch ex As System.Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Module

上面的宏尝试构建您的项目,启动外部应用程序,然后自动将DLL附加到该程序。您可以从附加到进程窗口获取系统的 QualifierName 。此外,托管代码的版本(在本例中为“托管(v4.0)”)取决于您使用的.NET框架的版本。

答案 2 :(得分:1)

如果您不想/无法使用外部应用 - 您可以直接从Visual Studio调用类库:Ctrl+Alt+I以显示"Immediate"寡妇,然后您就可以调用来自类库的任何方法(使用断点)。您必须输入完全限定名称(即名称空间)。

答案 3 :(得分:0)

我认为现在更实际的是创建一个单元测试项目来执行您的库代码。因此,您将一石二鸟:能够在同一解决方案中调试您的项目,顺便开始通过测试来覆盖您的代码。

答案 4 :(得分:0)

Microsoft的有用链接:Specify a calling app in a managed DLL project

  1. 打开您的班级图书馆项目
  2. 转到 [项目]
  3. 在底部选择项目的 [属性...]
  4. 转到 [Debug]
  5. 在“启动”行中,选择“可执行文件”
  6. 选择.exe文件的路径
  7. 设置断点
  8. 运行项目。

Microsoft的链接还有其他各种有用的调试方案。

我正在使用Visual Studio 16.4.5。