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

cpx*_*cpx 33 .net executable process

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

Iga*_*nik 41

我曾经从Scott Hanselman的面试问题清单中学到了一个技巧.您可以使用以下命令轻松列出在命令提示符下运行.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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不再适用于.NET 4.0,DLL已重命名.例如,对于托管CLR,Visual Studio的应用程序,您也会得到误报. (4认同)
  • 请注意,这确实忽略了可能的Mono进程. (3认同)
  • 运行时只是`mono`.或Windows上的`mono.exe`..Net使用PE让操作系统使用mscorlib.dll启动应用程序,但mono不会这样做.我认为真正的核心库叫做corlib.dll,因为它不是MS的corlib. (2认同)

wj3*_*j32 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.
}
Run Code Online (Sandbox Code Playgroud)


lub*_*sko 6

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

  • 它有什么不同?正在运行的应用程序没有.exe文件? (5认同)
  • 是的,你是对的,我的回答并不完整且防弹,我很抱歉讽刺评论. (2认同)

ste*_*hbu 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.


小智 6

我知道这是关于一万年为时已晚,但在情况下,它可以帮助 - 我最喜欢的方法找出如果一个EXE使用.NET是针对它运行MSIL反附带.NET SDK.如果你确实拥有.net exe,你会得到一个很好的图形细分其内容; 如果一个普通的旧win32 exe,它会收到一条消息告诉你.