【问题标题】:Attach ClassLibrary Project to External Application with VisualStudio使用 Visual Studio 将类库项目附加到外部应用程序
【发布时间】:2018-02-28 09:01:22
【问题描述】:

我有一个 ClassLibrary 项目,我需要将其附加到外部应用程序(控制台应用程序)。

我在这里找到了一些解决方案,确切地解释了我正在做的事情,但在我的情况下,它不能从 vs 运行,看起来我需要一些延迟来将 VS(自动附加)到可执行文件

我尝试执行以下操作,应用程序运行但未命中断点。

但是,如果我手动运行此过程并(等待加载)并将我的库附加到此过程,它可以工作,但我们需要自动执行此操作

我也在这样做,但是无论是否从 VisualStudio 运行可执行文件,附加(调试)都无法正常工作。

【问题讨论】:

  • 您是否将可执行文件导入到 Visual Studio 解决方案中? docs.microsoft.com/en-us/visualstudio/debugger/…
  • @FletchZhou-MSFT 感谢您的链接,我在这里测试并部分解决了我的问题,我的要求之一是避免向解决方案添加新项目,因为它是 ClassLibrary 的项目模板和那里不应该有第 3 方项目。但是我今天将用我制作的另一个解决方案来介绍这个问题,使用 EnvDTE.Process 并通过代码附加外部应用程序(通过调试调用),请随时在此处发布您的答案,它对某些场景有效 :) 谢谢。
  • 感谢您的回复。如果您找到了更好的解决方案,也可以将其发布为答案。

标签: c# visual-studio debugging


【解决方案1】:

如果类库解决方案不能有可执行项目,我们仍然可以调试它。 例如,我有一个名为 ClassLibrary1 的类库,其中的类很简单:

我还创建了一个独立的控制台项目,添加reference -> Browse -> 找到ClassLibrary1.dll。 添加 using 语句和代码,如下所示:

我放了断点,运行控制台项目,它就可以进入它了。

【讨论】:

    【解决方案2】:

    经过一些研究并感谢@Fletch Zhou 的帮助,我结束了调试器助手的创建。

    我所做的是,创建一个名为 DebuggerHelper 的新控制台应用程序,该应用程序运行我需要附加进程的“主应用程序”,等待(睡眠),然后将正在运行的 VisualStudio 实例附加到该 EXE。

    然后我将新的 exe 添加到我的 ClassLibrary 项目的调试选项中,并将这个 exe 文件添加为我的项目的一部分。 然后,当我按 F5 运行类库时,他会加载我的外部应用程序,并完美地附加它:)

    private static void AttachProcess()
    {
        var localByName = System.Diagnostics.Process.GetProcessesByName(_appName);
    
        MessageFilter.Register();
        var process = GetProcess(localByName[0].Id);
        if (process != null)
        {
            process.Attach();
            Console.WriteLine("Attached to {0}", process.Name);
        }
        MessageFilter.Revoke();
    }
    
    private static void StartProcess()
    {
        System.Diagnostics.Process.Start("start.bat");
    
        Console.WriteLine("Waiting to load the process...");
        System.Threading.Thread.Sleep(3000);
    }
    
    private static Process GetProcess(int processId)
    {
        // Visual Studio 2017 (15.0)
        var dte = (DTE)Marshal.GetActiveObject("VisualStudio.DTE.15.0");
        var processes = dte.Debugger.LocalProcesses.OfType<Process>();
        return processes.SingleOrDefault(x => x.ProcessID == processId);
    }
    

    Github 解决方案: https://github.com/thiagoloureiro/DebuggerHelper

    【讨论】:

    • 感谢您在这里分享您的解决方案,您可以将其标记为答案,这样可以帮助其他社区成员。祝你有美好的一天:)
    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多