在C#中如何获得调用者的信息?

我需要知道我的可执行程序(exe)是如何被调用的。比如:在资源管理器中被双击、在命令行或批处理中执行、或者被其他程序调用等。请注意:不是指程序内的过程被谁调用,而是整个e... 我需要知道我的可执行程序(exe)是如何被调用的。
比如:在资源管理器中被双击、在命令行或批处理中执行、或者被其他程序调用等。
请注意:不是指程序内的过程被谁调用,而是整个exe被谁调用。
我了解了关于命令行的内容,发现最多只能获取到自身的信息,不行。
请高人指点,或者请同好指引思路。谢谢。
展开
 我来答
GTA小鸡
高粉答主

2019-04-15 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.6万
采纳率:78%
帮助的人:1.3亿
展开全部

C#获取当前进程的父级进程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
   public static class ProcessExtensions
   {
      private static string FindIndexedProcessName(int pid)
      {
         var processName = Process.GetProcessById(pid).ProcessName;
         var processesByName = Process.GetProcessesByName(processName);
         string processIndexdName = null;
         for (var index = 0; index < processesByName.Length; index++)
         {
            processIndexdName = index == 0 ? processName : processName + "#" + index;
            var processId = new PerformanceCounter("Process", "ID Process", processIndexdName);
            if ((int)processId.NextValue() == pid)
            {
               return processIndexdName;
            }
         }
         return processIndexdName;
      }
      
      private static Process FindPidFromIndexedProcessName(string indexedProcessName)
      {
         var parentId = new PerformanceCounter("Process", "Creating Process ID", indexedProcessName);
         return Process.GetProcessById((int)parentId.NextValue());
      }
      
      public static Process Parent(this Process process)
      {
         return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id));
      }
   }

   class Program
   {
      static void Main(string[] args)
      {//测试
         Console.WriteLine(Process.GetCurrentProcess().Parent().ProcessName);
      }
   }
}
追问
用性能计数器的办法真是太棒了! 非常感谢!
我修改了返回的那一行,直接返回 Process 的 MainModule.FileName,达到了我的目标。
嗯,貌似过程中还有可精简优化的地方,我再想一想。
给你追加100分,采纳啦~
l7722526
2019-04-14 · TA获得超过2.7万个赞
知道大有可为答主
回答量:2.8万
采纳率:84%
帮助的人:3736万
展开全部
你已经写出来了,只要略加判断就是了 trace.GetFrame(1).GetMethod(); 这个括号里面的参数从0开始,0就是自己,1就是上一个,2就是上上一个3就是上上上一个 如果再上面没有了的话,就会返回一个异常字符串,你判断这个异常字符串是什么,就停止循环就好了 只要循环,不需要递归。
追问
可能是我没有表达清楚。请看问题正文中的“请注意”部分。
我需要的 不是 不是 不是 程序内的过程调用堆栈。
不是 StackTrace对象 或者 Environment.StackTrace 方法。
它们只能给出程序内的调用关系,不能告诉我是谁启动了这个 exe 文件。
还是 谢谢 回答。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式