35

There is an external workflow that executes C# scripts and is able to work with DLL files(my class library).

Is it possible to attach debug to my class library project so breakpoint will hit once this WF will call it?

Thanks

4

5 回答 5

34

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

配置您的项目以启动外部程序

  1. 打开您的 DLL 项目。

  2. 在项目的属性上,转到“调试”选项卡。

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

  4. 保存项目。

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

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

  7. 做任何事情来让外部应用程序加载你的库并运行你的代码。

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

附加到现有流程

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

(旁注:如果您使用的是 Visual Studio 的“Express”版本,我认为它没有此功能,但我不确定。这很容易判断:您要么拥有菜单以下第 4 步中提到的项目。)

  1. 确保进程正在运行。

  2. 打开您的 DLL 项目。

  3. 设置断点等。

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

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

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

  7. 做任何你做的事情来让外部进程加载并运行你的代码。

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


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

于 2012-12-06T11:16:01.323 回答
3

您可以使用Debug菜单中的Attach to process来调试您的 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 附加到该程序。您可以从Attach to process窗口获取系统的QualifierName 。此外,托管代码的版本(在这种情况下为“Managed (v4.0)”)取决于您使用的 .NET 框架的版本。

于 2013-03-07T16:45:59.087 回答
3

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

于 2018-04-12T11:22:33.123 回答
2

来自 Microsoft 的有用链接:在托管 DLL 项目中指定调用应用程序

  1. 打开你的类库项目
  2. 前往[项目]
  3. 在底部选择项目的[Properties...]
  4. 转到[调试]
  5. 在“启动”行中,选择“可执行文件”
  6. 选择 .exe 文件的路径
  7. 设置断点
  8. 运行项目。

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

我正在使用 Visual Studio 16.4.5。

于 2020-03-16T11:17:08.653 回答
-2

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

于 2017-07-26T12:39:49.240 回答