Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查程序是否正在使用.NET?_.net_Process_Executable - Fatal编程技术网

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

如何检查程序是否正在使用.NET?,.net,process,executable,.net,Process,Executable,我们可以检查正在运行的应用程序或程序是否使用.Net framework来执行自身吗?使用System.Reflection.Assembly.LoadFrom函数来加载.exe文件。如果尝试加载非.NET程序集的二进制文件,此函数将引发异常。以编程方式,您可以使用Win32 API(如NtQueryInformationProcess)或在.NET中使用System.Diagnostics.Process.GetProcesses获取起始映像名 并读取Process.StartInfo.Fil

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

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

以编程方式,您可以使用Win32 API(如NtQueryInformationProcess)或在.NET中使用System.Diagnostics.Process.GetProcesses获取起始映像名 并读取Process.StartInfo.FileName

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


注意事项:将只检测.NET构建的程序集,例如,不会检测使用CorHost API动态承载CLR的Win32 EXE。

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

任务列表/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();
}

使用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.
}

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

我知道这已经晚了大约一百万年,但如果有帮助的话——我最喜欢的确定exe是否使用.net的方法是对.net SDK附带的MSIL反汇编程序运行MSIL反汇编程序。如果你确实有一个.NETEXE,你会得到一个很好的图形化的内容分解;如果它是一个普通的旧win32 exe,您将收到一条消息,告诉您这一点。

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

若你们想要一个C语言的方法而不需要在管理员模式下运行你们的应用程序,那个么有一个由ProcessHacker工具引入的解决方案

根据:

大多数.NET进程都有一个对名为\BaseNamedObjects\Cor\u Private\u IPCBlockv4的部分打开的句柄。这与ICorPublish::GetProcess函数使用的对象相同。我们不调用该函数,而只是检查该节对象是否存在。这意味着:*性能更好。 *无需管理员权限即可获取其他用户拥有的进程的.NET状态


在C中获取进程句柄列表。相反,您可以从Process Hacker plugins文件夹下载DotNetTools.dll,并创建一个外部方法来使用PhGetProcessIsDotNet函数。

启动进程监视器,如果可执行文件高亮显示为黄色,则为托管应用程序。威尔,我想你指的是进程浏览器;这有什么区别?正在运行的应用程序没有.exe文件?在这种情况下,请告诉他如何找到与正在运行的程序对应的exe文件;并告诉他如何处理进程无法读取.EXE文件的可能性。是的,你是对的,我的回答不完整,不可靠,我很抱歉有讽刺性的评论。如果宿主进程是x64且exe仅为x86,则这不起作用。请注意,这会遗漏可能的Mono进程。@Dykam不是Mono的运行时也称为mscorlib.dll吗?运行时只是Mono。或windows上的mono.exe。Net使用PE让操作系统使用mscorlib.dll启动应用程序,但mono没有这样做。我认为真正的核心库叫做corlib.dll,因为它不是MS的corlib。我认为这对.NET 4.0不再有效,dll被重命名。对于承载CLR的应用程序,例如Visual Studio,也会出现误报。NET 4.0运行时称为CLR.dll。回答正确。具体来说,请运行ILDASM.EXE,它是随Visual Studio自动安装的。请参阅:要从Win8/VS2013启动ILDASM:开始->Visual Studio工具->VS2013的开发人员命令提示符。从Win8/VS2012:开始->开发人员命令->VS2012的开发人员命令提示符。从Wi7:所有程序- >微软VisualStudio> VisualStudioTooS> VisualStudio命令提示符。我想知道,如果您从C中这样做,在哪个条件下该检查报告不被管理?似乎它只考虑使用相同CLR的托管进程。所以我们应该小心。