如果这个问题不是最容易理解的,我提前道歉,我对C#和Windows窗体还是个新手。我正在做一个程序,允许用户在一个有组织的地方运行多个控制台应用程序(在我的情况下,Discord机器人)。我现在正在处理“打开文件”对话框,我想知道是否有一种方法来确定所选择的.exe文件是否是控制台应用程序?如果不进行此检查,如果用户选择的.exe文件不是控制台应用程序,则程序将崩溃。如果有人能给我指出正确的方向,我将不胜感激!谢谢你,谢谢
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+):
System.Reflection.Metadata
System.Reflection.PortableExecutable
File.Open()
FileStream
PEReader
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结构体中获得的内容
PEHeader
1条答案
按热度按时间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+):
当然,您可以返回一个
PEHeader
类对象,并检查所有其他可用的属性。您通常拥有从LOADED_IMAGE结构体中获得的内容