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