using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = @"C:\path\to\your\executable.exe";
bool isConsoleApp = IsConsoleApplication(filePath);
if (isConsoleApp)
{
Console.WriteLine("The selected executable is a console application.");
// Proceed with running the console application
}
else
{
Console.WriteLine("The selected executable is not a console application.");
// Show an error message or handle it as appropriate
}
Console.ReadLine();
}
static bool IsConsoleApplication(string filePath)
{
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (BinaryReader reader = new BinaryReader(stream))
{
// Check the PE signature
if (reader.ReadUInt16() != 0x5A4D) // "MZ" in ASCII
return false;
// Skip to the PE header
stream.Seek(0x3C, SeekOrigin.Begin);
int peHeaderOffset = reader.ReadInt32();
stream.Seek(peHeaderOffset, SeekOrigin.Begin);
// Check the PE signature
if (reader.ReadUInt32() != 0x00004550) // "PE\0\0" in ASCII
return false;
// Skip to the optional header
stream.Seek(20, SeekOrigin.Current);
// Read the subsystem value
ushort subsystem = reader.ReadUInt16();
// Check if it's a console application
return subsystem == 0x0003; // 0x0003 represents IMAGE_SUBSYSTEM_WINDOWS_CUI
}
}
}
}
2条答案
按热度按时间wf82jlnq1#
针对.NET Core或.NET 5+,您可以使用
System.Reflection.PortableExecutable
命名空间(System.Reflection.Metadata
程序集的一部分)。它的PEReader类(在.NET Framework中不可用)允许读取PE Headers,而无需PInvoke,例如ImageLoad()或MapAndLoad()等。
使用起来很简单。
使用您使用
File.Open()
或初始化FileStream
打开的Stream初始化PEReader
类,传递图像文件的完整路径,然后读取您返回的PEHeaders对象的内容。最小实现(.NET 5+,C# 8.0+):
当然,您可以返回一个
PEHeader
类对象并检查所有其他可用的属性。通常,您会从LOADED_IMAGE结构中得到什么b1payxdu2#
在C#中,您可以通过检查其子系统类型来确定可执行文件是否是控制台应用程序。控制台应用程序的子系统类型为IMAGE_SUBSYSTEM_WINDOWS_CUI。另一方面,Windows窗体应用程序的子系统类型为IMAGE_SUBSYSTEM_WINDOWS_GUI。
要检查可执行文件的子系统类型,可以使用C#中的System. Diagnostics. FileVersionInfo类。下面是一个示例,说明如何做到这一点:
在上面的示例中,您可以将**@"C:\path\to\your\executable.exe "**替换为用户使用“打开文件”对话框选择的. exe文件的路径。
请注意,这种方法依赖于可执行文件的元数据中指定的子系统类型,因此如果信息丢失或不正确,它将无法确定可执行文件的类型。
我希望这对你的项目有帮助!如果你还有什么问题就告诉我。