如何在C#中确定进程是否受管理?

5

定义“托管代码”。Java是托管的,解释性语言也是托管的。您是否特别关注.NET程序集或任何类型的托管代码? - Ed S.
我不认为这很奇怪。那是核心库dll的文件名。 - user47589
@Ed S. 抱歉,我所说的“托管代码”是指在CLR之上运行的代码。@yodaj007 这是否保证在所有版本的.NET Framework和所有语言中都是相同的? - aolszowka
2
你是否关心主可执行文件是.NET程序集,还是只关心所讨论的进程是否托管了CLR?后者适用于例如Windows资源管理器或Office应用程序中的托管插件。你需要以编程方式实现这一点吗?否则,Process Explorer将突出显示所有托管.NET CLR的进程。 - Dirk Vollmar
@0xA3 这是一个有趣的问题,我已经忘记了。如果可能的话,我想检测这两种情况。本质上,如果我能够以编程方式复制ProcessExplorer所做的操作来确定进程是否托管.NET CLR,那将是理想的。 - aolszowka
1
与此同时,您可能想查看以下问题:https://dev59.com/YHI95IYBdhLWcg3w8y2N - Dirk Vollmar
2个回答

6

对于未来的谷歌搜索者:我最终使用了在这里发布的建议答案 如何检查程序是否正在使用.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。


1
或者在单个LINQ表达式中:return process.Modules.Cast<ProcessModule>().Any(module => module.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase)); - MasterMastic

1
在代码中,获取正在执行的进程的完整路径。 尝试在该进程上使用Assembly.Load。如果成功了,那么它就是一个 .Net 程序集 :)

1
从安全角度来看,这并不是一个理想的解决方案。请记住,如果您加载一个程序集,它可以在您的应用程序域中执行代码。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接