Как узнать, если ".exe " процесс был написан с C++ или c#? [дубликат]
Возможные Дубликаты:
как узнать, использует ли приложение win32 среду выполнения .NET
есть способ вручную распознать, если определенный ".exe " процесс был написан с C++(неуправляемый код) или С C#(управляемый код)?
4 ответов
Если вы пытаетесь определить, является ли процесс это процесс .NET, я могу предложить решение, вдохновленное ответом Дэйва Ван ден Эйнде в этой теме:как узнать, использует ли приложение win32 среду выполнения .NET
"приложения .Чистый исполняемый файл, если он требует mscoree.DLL для запуска.".
учитывая это, вы проверяете модули процесса, чтобы увидеть, указан ли mscoree.
foreach (var process in Process.GetProcesses())
{
if (process.Modules.OfType<ProcessModule>().Any(m => m.ModuleName.Equals("mscoree.dll", StringComparison.OrdinalIgnoreCase)))
{
Console.WriteLine("{0} is a .NET process", process.ProcessName);
}
}
здесь вы можете найти подробности, как это можно сделать:определение того, является ли DLL или EXE управляемым компонентом
вы можете запустить peverify или ildasm (доступный из среды командной строки Visual Studio) в файле, и это даст вам ошибку, если это не управляемый код. Обратите внимание, что это произойдет в некоторых случаях, когда они используют систему защиты, которая шифрует IL и скрывает загрузчик CLR, но большинство программ не имеют этой защиты.
Если это .NET .exe (или .dll, если на то пошло), он будет иметь зависимость от mscoree.dll, который вы можете увидеть, изучив его с помощью Зависимость Walker или что-то подобное.
Если вы хотите сделать это программно, вы можете взять этот проект VB в качестве отправной точки.
Это не скажет вам наверняка, хотя язык. Вы не можете отличить C# от a VB.NET (или другой язык .NET) программа или C++ из программы C (или другой не .NET язык.) Есть некоторые вещи, которые могут исключить тот или иной язык как единственный используемый, или сделать тот или другой более вероятным. Там может быть даже неуправляемый код, использующий mscoree.dll каким-то странным образом.