可能是重复的问题:
如何判断win32应用程序是否使用了.NET运行时
有没有一种方法可以手动识别特定的".exe"进程是使用C++(非托管代码)还是使用C#(托管代码)编写的?
可能是重复的问题:
如何判断win32应用程序是否使用了.NET运行时
有没有一种方法可以手动识别特定的".exe"进程是使用C++(非托管代码)还是使用C#(托管代码)编写的?
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);
}
}
==
比较字符串可能会产生误导,因为某些进程模块名称是MSCOREE.DLL
。将==
更改为m.ModuleName.Equals("mscoree.dll", StringComparison.InvariantCultureIgnoreCase)
是一个更安全的选择。 - dragonfly02您可以在Visual Studio命令行环境中使用peverify或ildasm(可用)运行文件,如果它不是托管代码,则会给出错误。请注意,在某些使用保护系统加密IL和隐藏CLR bootloader的情况下,此方法可能会失败,但大多数程序都没有这种保护。
如果它是一个.NET .exe(或.dll),它将依赖于mscoree.dll,您可以通过使用Dependency Walker或类似工具来检查它。
如果您想以编程方式执行此操作,可以以this VB project为起点。
但这并不能确定程序的语言。您无法确定C#与VB.NET(或其他.NET语言)程序之间的区别,也无法确定C++与C程序(或其他非.NET语言)之间的区别。有些事情可以排除其中一种语言的可能性,或使其中一种语言更有可能。甚至可能存在以某种奇怪的方式使用mscoree.dll的非托管代码。