【问题标题】:How do I determine if a Process is Managed in C#?如何确定进程是否在 C# 中进行管理?
【发布时间】:2011-02-14 22:24:23
【问题描述】:

稍作搜索返回此结果:Which processes are running managed code and which version?

但是我想知道是否有一种“更好”的方法,然后简单地迭代加载的模块?寻找字符串“mscorwks.dll”似乎有点古怪。阅读 MSDN 上的Process Class 似乎并没有指出一个明显的解决方案。

假设

  1. .NET 4.0
  2. 我手头有一个“流程”

谢谢

【问题讨论】:

  • 定义“托管代码”。 Java 是托管的,解释语言也是托管的。您是否对 .NET 程序集或任何类型的托管代码特别感兴趣?
  • 我不认为它很古怪。这是核心库 dll 的文件名。
  • @Ed S. 抱歉,“托管代码”是指在 CLR 之上运行的代码。 @yodaj007 是否保证所有版本的 .NET Framework 和所有语言都相同?
  • 您是否对主要可执行文件是否是 .NET 程序集感兴趣,或者只是对相关进程是否托管 CLR 感兴趣?后者是托管加载项的情况,例如Windows 资源管理器或 Office 应用程序。您是否需要以编程方式执行此操作?否则,Process Explorer 将突出显示所有托管 .NET CLR 的进程。
  • 同时你可能想看看这个问题:stackoverflow.com/questions/2080046/…

标签: c# process


【解决方案1】:

对于任何未来的 Google 员工:我最终使用了此处发布的建议答案 How to check if a program is using .NET?(感谢 0xA3!)

Process mProcess = //Get Your Process Here
foreach (ProcessModule pm in mProcess.Modules)
{
    if (pm.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase))
    {
        return true;
    }
}

顺便说一句,我在原始帖子中提到的寻找“mscorwks.dll”不适用于 .NET 4.0。

【讨论】:

  • 或在单个 LINQ 表达式中:return process.Modules.Cast<ProcessModule>().Any(module => module.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase));
【解决方案2】:

在代码中,获取执行进程的完整路径。 尝试在进程中使用Assembly.Load。如果它有效,它就是一个 .Net 程序集 :)

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多