In einer C# -Anwendung möchte ich feststellen, ob eine andere .NET-Anwendung eine Konsolenanwendung ist oder nicht.Wie kann ich das Subsystem ermitteln, das von einer bestimmten .NET-Assembly verwendet wird?
Kann dies mit den Reflektions-APIs geschehen?
EDIT: OK, es sieht nicht so aus, als würde ich eine gute Antwort auf diese Frage bekommen, weil es nicht so aussieht, als würde das Framework die Funktionalität offen legen, die ich möchte. Ich kramte in der PE/COFF spec und kam mit dieser:
/// <summary>
/// Parses the PE header and determines whether the given assembly is a console application.
/// </summary>
/// <param name="assemblyPath">The path of the assembly to check.</param>
/// <returns>True if the given assembly is a console application; false otherwise.</returns>
/// <remarks>The magic numbers in this method are extracted from the PE/COFF file
/// format specification available from http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx
/// </remarks>
bool AssemblyUsesConsoleSubsystem(string assemblyPath)
{
using (var s = new FileStream(assemblyPath, FileMode.Open, FileAccess.Read))
{
var rawPeSignatureOffset = new byte[4];
s.Seek(0x3c, SeekOrigin.Begin);
s.Read(rawPeSignatureOffset, 0, 4);
int peSignatureOffset = rawPeSignatureOffset[0];
peSignatureOffset |= rawPeSignatureOffset[1] << 8;
peSignatureOffset |= rawPeSignatureOffset[2] << 16;
peSignatureOffset |= rawPeSignatureOffset[3] << 24;
var coffHeader = new byte[24];
s.Seek(peSignatureOffset, SeekOrigin.Begin);
s.Read(coffHeader, 0, 24);
byte[] signature = {(byte)'P', (byte)'E', (byte)'\0', (byte)'\0'};
for (int index = 0; index < 4; index++)
{
Assert.That(coffHeader[index], Is.EqualTo(signature[index]),
"Attempted to check a non PE file for the console subsystem!");
}
var subsystemBytes = new byte[2];
s.Seek(68, SeekOrigin.Current);
s.Read(subsystemBytes, 0, 2);
int subSystem = subsystemBytes[0] | subsystemBytes[1] << 8;
return subSystem == 3; /*IMAGE_SUBSYSTEM_WINDOWS_CUI*/
}
}
Ja - im nativen Code verwende ich normalerweise die dbghelp Apis dafür, aber ich bin nicht im systemeigenen Code :( –
@Billy ONeal die Struktur der Header ist sehr einfach und gut bekannt. Es dauert einige Zeilen Code in C++ (+ Header) – Andrey