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

问题描述 投票:27回答:5

[有一个外部工作流,它执行C#脚本并能够使用DLL文件(我的类库)。

是否有可能将debug附加到我的类库项目中,所以一旦该WF调用它,断点就会命中?

谢谢

c# visual-studio debugging visual-studio-debugging class-library
5个回答
29
投票

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

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

  1. 打开您的DLL项目。

  2. 在项目的属性上,转到Debug选项卡。

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

    ] >
  4. 保存项目。

  5. 在代码中的断点处设置它们。

  6. 按F5键开始调试。 ((此时,您的断点将说它们不会被击中,因为没有加载符号。暂时不用担心。)>

  7. ] >>
  8. 尽一切努力使外部应用程序加载您的库并运行您的代码。

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

    附加到现有过程

    如果无法启动该过程,而不得不附加到已经在运行的过程中,则也可以这样做:

(注意:如果您使用的是Visual Studio的“ Express”版,我不think

具有此功能,但是我不确定。很容易告诉您:您将不会拥有下面第4步中提到的菜单项。]
  1. 确保进程正在运行。

  2. 打开您的DLL项目。

  3. 设置断点等

  4. Debug

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

    ] >>
  7. Visual Studio将进入调试模式。 ((此时,您的断点将说它们不会被击中,因为没有加载符号。暂时不用担心。)>

  8. ] >>
  9. 尽一切努力使外部进程加载并运行您的代码。

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


    NB

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

您可以使用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自动附加到该程序。您可以从附加到流程窗口中获取系统的QualifierName。另外,托管代码的版本(在这种情况下为“ Managed(v4.0)”)取决于您使用的.NET Framework版本。

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

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

  1. 打开您的班级图书馆项目
  2. 转到[项目]
  • 在底部选择项目的[属性...]
  • 转到[调试]
  • 在“启动”行中,选择“可执行文件”
  • 选择.exe文件的路径
  • 设置断点
  • 运行项目。
  • Microsoft的链接还有其他各种有用的调试方案。

    我正在使用Visual Studio 16.4.5。

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


    2
    投票

    您可以使用Debug

    菜单中的Attach to process来调试DLL项目。如果本机代码未进行调试,则可能需要使用混合模式调试。可以通过在附加到流程窗口中单击选择按钮时出现的窗口中选择托管和本机

    2
    投票

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

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

    1. 打开您的班级图书馆项目
    2. 转到[项目]
  • 在底部选择项目的[属性...]

  • 0
    投票

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

    1. 打开您的班级图书馆项目
    2. 转到[项目]

    -1
    投票

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

    © www.soinside.com 2019 - 2024. All rights reserved.