【问题标题】:dotnet core 2.0 - programmatically attach the VS2017 debugger to a processdotnet core 2.0 - 以编程方式将 VS2017 调试器附加到进程
【发布时间】:2018-02-06 09:39:15
【问题描述】:

在我的 dotnet core 2.0 应用程序中,我在某个时间点在不同的进程(使用一些不同的参数)中重新启动了相同的应用程序。我希望能够以编程方式将当前的 Visual Studio (2017) 调试器附加到新进程。

Here is an example of how it is done in full framework 但对于初学者来说,Marshal.GetActiveObject 方法似乎不存在。

在 dotnet core 2.0 中是否有不同的方法来实现这一点?还是根本不可能?

【问题讨论】:

  • 从长远来看,它无助于解决您的问题,但 Mashal.GetActiveObject 在 .NET Core 中不存在,因为它是 .NET Framework, Xamarin and Mono specific API - 大概是因为它进行 Windows 特定的 API 调用在引擎盖下。
  • 是的,我想了很多 - 只是想知道是否有不同的方式或者我可以带来一个 nuget 包。已经检查了Windows Compatibility Pack
  • 如果您需要使用 .NET Framework API,请更改应用程序以使其使用 .NET Framework。

标签: c# .net-core asp.net-core-2.0 .net-standard


【解决方案1】:

虽然这种情况正在发生变化,但 .Net Core 被设想为尽可能跨平台,并且最初省略了许多“仅限 Windows”的方法。也就是说,您仍然可以使用 P/Invoke 调用底层的 windows 函数:

[DllImport("oleaut32.dll", PreserveSig = false)]
static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved,
    [MarshalAs(UnmanagedType.IUnknown)] out object ppunk);

[DllImport("ole32.dll")]
static extern int CLSIDFromProgID(
    [MarshalAs(UnmanagedType.LPWStr)] string lpszProgID, out Guid pclsid);
....

// Replace XX with the correct version
CLSIDFromProgID($"VisualStudio.DTE.XX.0", out var classId); 
GetActiveObject(ref classId, default, out dte);

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 2020-06-17
    • 2020-02-05
    • 1970-01-01
    • 2019-08-12
    • 2012-11-09
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多