Можно ли проверить, работает ли запущенное приложение или программа .Net framework для выполнения?
Как проверить, использует ли программа .NET?
Ответ 1
Вот трюк, который я когда-то узнал из списка вопросов о опросе Scott 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();
}
Ответ 2
Используйте COM-интерфейсы CLR ICorPublish и ICorPublishProcess. Самый простой способ сделать это из С# - заимствовать некоторый код из отладчика SharpDevelop и сделать следующее:
ICorPublish publish = new ICorPublish();
ICorPublishProcess process;
process = publish.GetProcess(PidToCheck);
if (process == null || !process.IsManaged)
{
// Not managed.
}
else
{
// Managed.
}
Ответ 3
Используйте функцию System.Reflection.Assembly.LoadFrom
для загрузки файла .exe. Эта функция будет генерировать исключение, если вы попытаетесь загрузить двоичный файл, который не является сборкой .NET.
Ответ 4
Программно вы получите начальное имя изображения, используя Win32 API, например NtQueryInformationProcess
, или в .Net use System.Diagnostics.Process.GetProcesses()
и прочитайте Process.StartInfo.FileName
.
Затем откройте и декодируйте заголовки PE этого изображения, используя сведения, предписанные в статье MSDN ниже:
http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Предостережения: будут обнаруживать только .NET-сборки, например. не обнаружит Win32 EXEs, динамически размещающих CLR, используя API-интерфейсы CorHost.
Ответ 5
Я знаю, что это около миллиона лет слишком поздно, но в случае, если это помогает - мой любимый метод выяснить, использует ли exe.net, запустить MSIS дизассемблер против него, который поставляется с .net SDK. Если у вас действительно есть .net exe, вы получите красивое графическое разбиение его содержимого; если обычный старый win32 будет таким, вы получите сообщение, сообщающее вам об этом.
Ответ 6
Я предлагаю загрузить Redgate DotNetReflector и проверить, может ли он открыть приложение.