我有一个ClassLibrary项目,我需要将其附加到外部应用程序(控制台应用程序)。
我在这里找到了一些解决方案来解释我正在做的事情,但在我的情况下它不能从vs运行,看起来我需要一些延迟到VS(AutoAttach)到可执行文件
我尝试执行以下操作,应用程序会运行,但断点不会被击中。
但是,如果我手动运行此流程并且(等待加载)并将我的库附加到此流程它可以正常工作,但我们需要自动执行此操作
我也是这样做的,但无论是否运行VisualStudio中的可执行文件,附加(调试)都无法正常工作。
答案 0 :(得分:1)
如果类库解决方案不能拥有可执行项目,我们仍然可以调试它。 例如,我有一个名为 ClassLibrary1 的类库,其中的类很简单:
我还创建了一个控制台项目,单独添加参考 - >浏览 - >找到ClassLibrary1.dll 。 添加using语句和代码如下:
我放置了断点,运行控制台项目,它可以进入它。
答案 1 :(得分:1)
经过一些研究并感谢@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