Как узнать, был ли процесс ".exe" написан с помощью C++ или С#?

Возможный дубликат:
Как определить, использует ли приложение win32 среду выполнения.NET

Существует способ распознать вручную, если конкретный процесс ".exe" был написан с помощью C++ (неуправляемый код) или с С# (управляемый код)?

Ответ 1

Если вы пытаетесь определить, является ли процесс процессом.NET, я могу предложить решение, основанное на Dave Van den Eynde, в этом разделе: Как узнать, использует ли приложение win32 среду выполнения.NET

"Приложение является исполняемым.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);
            }
        }

Ответ 3

Вы можете запустить peverify или ildasm (доступный из среды командной строки Visual Studio) в файле, и это даст вам сообщение об ошибке, если он не управляет кодом. Обратите внимание, что в некоторых случаях это приведет к сбою, когда они используют систему защиты, которая шифрует IL и скрывает загрузчик CLR, но большинство программ не имеют этой защиты.

Ответ 4

Если это.NET.exe (или.dll, если на то пошло), он будет иметь зависимость от mscoree.dll, которую вы можете увидеть, исследуя его с помощью Dependency Walker или что-то подобное.

Если вы хотите сделать это программно, вы можете взять этот проект VB в качестве отправной точки.

Тем не менее, это не скажет вам язык. Вы не можете указать С# из VB.NET (или другого языка.NET) или C++ из C-программы (или другого языка, отличного от.NET). Есть некоторые вещи, которые могут управлять тем или иным способом как единственным языком, используемым, или сделать тот или другой более вероятным. Может быть даже неуправляемый код, использующий mscoree.dll каким-то странным способом.