C# 从非交互式后台进程以编程方式为任务管理器显示设置自定义进程名称

C# 从非交互式后台进程以编程方式为任务管理器显示设置自定义进程名称,c#,debugging,console-application,vsix,C#,Debugging,Console Application,Vsix,我意识到以前有人问过这类问题,但我有一个非常具体(而且相当复杂)的案例,与之微妙不同,因此通常的解决方案要么不起作用,要么不适用 基本上,我有一个由VSIX调试器启动器启动的控制台应用程序。此应用程序的目的是加载托管DLL,建立适当的环境,并允许从Visual Studio调试DLL的源代码,就像调试普通C#项目一样。不同之处在于,此项目不是可执行文件,而是库,因此它需要一个主机(即所讨论的控制台应用程序)。这与ASP.NET项目与IIS/IIS Express的工作方式非常相似—只是我编写了一

我意识到以前有人问过这类问题,但我有一个非常具体(而且相当复杂)的案例,与之微妙不同,因此通常的解决方案要么不起作用,要么不适用

基本上,我有一个由VSIX调试器启动器启动的控制台应用程序。此应用程序的目的是加载托管DLL,建立适当的环境,并允许从Visual Studio调试DLL的源代码,就像调试普通C#项目一样。不同之处在于,此项目不是可执行文件,而是库,因此它需要一个主机(即所讨论的控制台应用程序)。这与ASP.NET项目与IIS/IIS Express的工作方式非常相似—只是我编写了一个自定义主机,并从自定义VSIX管理其启动

自定义主机应用程序是一个.NET核心控制台应用程序,调试器在没有任何窗口的情况下启动它。这是经过深思熟虑的,因为它不需要交互输入,所有输出都重定向到VisualStudio的调试器会话(即“事件”选项卡)

该应用程序也是通用的,因此在实际启动之前,它无法知道调试项目的名称。最重要的是,我可以让Visual Studio的多个实例同时调试多个不同的项目

我真的很想在TaskManager中简化这些进程的区分,以便它们都显示为每个实例中承载的特定DLL项目的名称。到目前为止,我的努力是:

// 1. This crashes with InvalidOperationException because there is no window.
Console.Title = loadedDllProjectName;

// 2. This doesn't crash, but has no effect, either.
[DllImport("user32.dll")]
static extern int SetWindowText(IntPtr hWnd, string text);
...
SetWindowText(Process.GetCurrentProcess().MainWindowHandle, loadedDllProjectName);
FWIW,任务管理器以其默认映像名称显示进程,并将其列在后台进程中。后者是可以预料的。但我想改变前者。怎么做

更新
据我所知,我的追求可能是空洞的。不过,还是希望得到一个鼓舞人心的暗示

仅供参考:现在,我将使用一个稍微麻烦的解决方案,该解决方案涉及以与托管DLL(sans文件扩展名)相同的名称复制宿主应用程序可执行文件。这解决了当前问题的一部分,但并不理想。在找到更好的解决方案之前,我将保留这个问题。我认为旧的答案仍然适用于win10和其他windows版本:您无法设置进程的名称,您将在任务管理器中找到运行的可执行文件的名称,并且正如您所经历的,如果您的进程没有窗口,则无法设置任何窗口文本。据我所知,你想得到的是不可能的。我很高兴自己错了,学到了新东西