winforms 如何检查可执行文件是控制台还是GUI应用程序?

rryofs0p  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(127)

如果这个问题不是最容易理解的,我提前道歉,我对C#和Windows窗体还是个新手。
我正在做一个程序,允许用户在一个有组织的地方运行多个控制台应用程序(在我的情况下,Discord机器人)。我现在正在处理“打开文件”对话框,我想知道是否有一种方法来确定所选择的.exe文件是否是控制台应用程序?如果不进行此检查,如果用户选择的.exe文件不是控制台应用程序,则程序将崩溃。
如果有人能给我指出正确的方向,我将不胜感激!谢谢你,谢谢

dm7nw8vv

dm7nw8vv1#

针对.NET Core或.NET 5+,您可以使用System.Reflection.Metadata程序集的System.Reflection.PortableExecutable命名空间。
它的PEReader类(在.NET Framework中不可用)允许读取PE Headers,而不需要Pockerke,例如ImageLoad()MapAndLoad()等。
使用起来很简单。
使用您使用File.Open()或初始化FileStream打开的Stream初始化PEReader类,传递图像文件的完整路径,然后读取您返回的PEHeaders对象的内容。
最小实现(.NET 5+,C# 8.0+):

using System.Reflection.PortableExecutable;

string imagePath = @"[Full path of executable file]"
bool isConsoleApp = GetExeType(imagePath, out bool isDll) == Subsystem.WindowsCui;

// [...]

public Subsystem GetExeType(string imagePath, out bool isDll) {
    using var stream = File.Open(imagePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    using var reader = new PEReader(stream);
    isDll = reader.PEHeaders.IsDll;
    return reader?.PEHeaders?.PEHeader != null ? reader.PEHeaders.PEHeader.Subsystem : Subsystem.Unknown;
}

当然,您可以返回一个PEHeader类对象,并检查所有其他可用的属性。您通常拥有从LOADED_IMAGE结构体中获得的内容

相关问题