如果这个问题不是最容易理解的,请提前道歉,我仍然是C#和Windows窗体的新手.

我正在编写一个程序,允许用户在一个有组织的地方运行多个控制台应用程序(在我的情况下,是discord机器人).我现在正在"打开文件"对话框中工作,我想知道是否有方法可以确定所选的.exe文件是否是控制台应用程序?如果没有进行此判断,如果用户 Select 了不是控制台应用程序的.exe文件,我的程序将崩溃.

如果有人能为我指明正确的方向,我将不胜感激!谢谢!

推荐答案

针对.NET Core或.NET 5+,您可以利用System.Reflection.PortableExecutable命名空间,这是System.Reflection.Metadata程序集的一部分.

它的PEReader类(在.NET框架中不可用)允许读取PE Headers而不需要PInvoke,例如ImageLoad()MapAndLoad()等.

It's quite simple to use.
Initialize a PEReader class using a Stream you have opened using, e.g., File.Open() or initializing a FileStream, passing the full path of an image file, then read the content of the PEHeaders object you get back.

最小实现(.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 struct 中获得的东西

Csharp相关问答推荐

为什么Microsoft.AspNetCore. htttp.FormFile不实现IDDisposable?

System.Text.Json Utf8JsonReader正在读取数组值两次

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

如何从顶部提取发票号作为单词发票后的第一个匹配

禁用AutoSuggestBox项目更改时的动画?

C#类主构造函数中的调试参数

读取配置文件(mytest. exe. config)

如何使用XmlSerializer反序列化字符串数组?

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

在LINQ Where子句中使用新的DateTime

创建临时Collection 最有效的方法是什么?堆栈分配和集合表达式之间的区别?

如何注册类使用多级继承与接口

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

实体框架-IsRequired()与OnDelete()

C#LINQ延迟执行和嵌套方法

在同一个捕获中可以有多种类型的异常吗?

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

使用C#12中的主构造函数进行空判断

如何使用LINQ在C#中填充列表列表?