Как проверить, использует ли программа.NET?

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

7 ответов

Решение

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

Используйте 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.
}

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

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

Программно вы получите имя начального изображения, используя 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.

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

Если вам нужен метод в 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 функция.

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

Другие вопросы по тегам