如何检查程序是否使用.NET?

时间:2010-01-17 05:16:05

标签: .net process executable

我们可以检查正在运行的应用程序或程序是否使用.Net框架来执行自身?

7 个答案:

答案 0 :(得分:41)

我从Scott Hanselman的list of interview questions那里学到了一个技巧。您可以使用以下命令在命令提示符中轻松列出所有运行.NET的程序:

  

tasklist /m "mscor*"

它将列出所有已加载模块中mscor*的进程。

我们可以在代码中应用相同的方法:

public static bool IsDotNetProcess(this Process process)
{
  var modules = process.Modules.Cast<ProcessModule>().Where(
      m => m.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase));

  return modules.Any();
}

答案 1 :(得分:11)

使用CLR COM接口ICorPublish和ICorPublishProcess。从C#执行此操作的最简单方法是从SharpDevelop的调试器中借用一些代码,并执行以下操作:

ICorPublish publish = new ICorPublish();
ICorPublishProcess process;

process = publish.GetProcess(PidToCheck);

if (process == null || !process.IsManaged)
{
    // Not managed.
}
else
{
    // Managed.
}

答案 2 :(得分:6)

使用System.Reflection.Assembly.LoadFrom函数加载.exe文件。如果您尝试加载非.NET程序集的二进制文件,则此函数将抛出异常。

答案 3 :(得分:6)

以编程方式,您可以使用Win32 API(例如NtQueryInformationProcess)或.Net使用System.Diagnostics.Process.GetProcesses()获取起始图像名称 并阅读Process.StartInfo.FileName

然后使用以下MSDN文章中规定的详细信息打开并解码该图像的PE标头:

http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

警告:只会检测.NET构建的程序集,例如不会使用CorHost API检测动态托管CLR的Win32 EXE。

答案 4 :(得分:6)

我知道这已经太晚了一百万年了,但万一它有所帮助 - 我最喜欢的方法来判断一个exe是否正在使用.net就是运行MSIL反汇编来对抗.net SDK附带的。如果你确实拥有.net exe,你会得到一个很好的图形细分其内容;如果一个普通的旧win32版本,你会得到一条消息告诉你。

答案 5 :(得分:2)

我建议下载Redgate的DotNetReflector并检查它是否可以打开应用程序。

答案 6 :(得分:0)

Performance Monitor中提供了运行中的.NET进程的列表。只需运行perfmon,然后在监控工具>>性能监视器中单击 + 图标或按Ctrl + N。在可用计数器的列表中,在列表的开头找到 .NET CLR Jit ,然后选择一个子项。您将在所选对象的实例列表中看到一个.NET进程列表。

如果您希望使用C#方法而不在管理员模式下运行应用程序,则 Process Hacker 工具会引入解决方案。

根据Process Hacker / .NET Tools / native.c

  

大多数.NET进程的句柄都打开到名为 \ BaseNamedObjects \ Cor_Private_IPCBlock( v4) 的部分。这是ICorPublish使用的同一对象: :GetProcess函数。无需调用该函数,我们只需检查该section对象是否存在。这意味着:*更好的性能。   *无需管理员权限即可获得其他用户拥有的进程的.NET状态。

获取C#is a bit of hard work中的Process句柄列表。相反,您可以从Process Hacker plugins文件夹下载 DotNetTools.dll ,并创建一个extern方法来使用PhGetProcessIsDotNet功能。