Как проверить, использует ли программа .NET? - PullRequest
33 голосов
/ 17 января 2010

Можем ли мы проверить, работает ли запущенное приложение или программа .Net framework для себя?

Ответы [ 7 ]

41 голосов
/ 17 января 2010

Есть одна хитрость, которую я однажды узнал из списка вопросов для интервью Скотта Хансельмана . Вы можете легко перечислить все программы с .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();
}
11 голосов
/ 17 января 2010

Используйте COM-интерфейсы CLR ICorPublish и ICorPublishProcess.Самый простой способ сделать это из C # - позаимствовать некоторый код из отладчика SharpDevelop и сделать следующее:

ICorPublish publish = new ICorPublish();
ICorPublishProcess process;

process = publish.GetProcess(PidToCheck);

if (process == null || !process.IsManaged)
{
    // Not managed.
}
else
{
    // Managed.
}
6 голосов
/ 09 февраля 2012

Я знаю, что это примерно на миллион лет позже, но в случае, если это поможет - мой любимый способ выяснить, использует ли exe-файл .net - запускать дизассемблер MSIL, который поставляется с .net SDK. Если у вас действительно есть .net exe, вы получите красивую графическую разбивку его содержимого; если это будет старый добрый win32 exe, вы получите сообщение, сообщающее об этом.

6 голосов
/ 17 января 2010

Программно вы получите имя начального образа, используя Win32 API, например NtQueryInformationProcess, или в .Net используйте System.Diagnostics.Process.GetProcesses() и читать Process.StartInfo.FileName.

Затем откройте и декодируйте PE-заголовки этого образа, используя сведения, описанные в статье MSDN ниже:

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

Предостережения: будут обнаружены только сборки .NET, например не будет обнаруживать Win32 EXE-файлы, динамически размещающие CLR с использованием API CorHost.

6 голосов
/ 17 января 2010

Используйте функцию System.Reflection.Assembly.LoadFrom для загрузки файла .exe. Эта функция вызовет исключение, если вы попытаетесь загрузить двоичный файл, который не является сборкой .NET.

2 голосов
/ 17 января 2010

Я предлагаю скачать DotNetReflector от Redgate и проверить, может ли он открыть приложение.

0 голосов
/ 25 июля 2018

Список запущенных процессов .NET доступен в Performance Monitor. Просто запустите perfmon и в Инструменты мониторинга >> Монитор производительности щелкните значок + или нажмите Ctrl + N. В списке доступных счетчиков в начале списка найдите .NET CLR Jit и выберите вложенный элемент. Вы увидите список процессов .NET в Экземпляры выбранного объекта list.

Если вам нужен метод в C # без запуска приложения в режиме администратора, есть решение, представленное инструментом Process Hacker .

Согласно Process Hacker / .NET Tools / native.c :

Большинство процессов .NET имеют дескриптор, открытый для раздела с именем \ BaseNamedObjects \ Cor_Private_IPCBlock ( v4) . Это тот же объект, который используется ICorPublish :: GetProcess функция. Вместо вызова этой функции мы просто проверяем существование этого объекта раздела. Это означает: * Лучшая производительность. * Нет необходимости в правах администратора для получения статуса .NET процессов, принадлежащих другим пользователям.

Получение списка дескрипторов процесса в C # - это немного тяжелая работа . Вместо этого вы можете загрузить DotNetTools.dll из папки Process Hacker plugins и создать метод extern для использования функции PhGetProcessIsDotNet.

...