C# 응용 프로그램에서 다른 .NET 응용 프로그램이 콘솔 응용 프로그램인지 여부를 확인하고 싶습니다.주어진 .NET 어셈블리에서 사용하는 하위 시스템을 어떻게 결정합니까?
리플렉션 API를 사용하여 수행 할 수 있습니까?
EDIT : 프레임 워크가 원하는 기능을 제공하지 않는 것처럼 보이지 않으므로이 질문에 대한 좋은 대답을 얻지 못할 것 같습니다. 나는 PE/COFF 사양에 주위 파고이 함께했다 :
/// <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*/
}
}
내가, 내 마음에 오는 가장 가까운 해결 방법이 있는지 확인하는 반사를 사용을 결정하는 과학적인 방법이 생각하지 않습니다
예 - 네이티브 코드에서 저는 보통 dbghelp apis를 사용합니다. 그러나 기본 코드가 아닙니다 : ( –
@Billy ONeal 헤더 구조는 매우 간단하고 잘 알려져 있습니다. C++에서 몇 줄의 코드가 필요합니다. + 헤더) 하위 시스템을 찾을 수 있습니다. 나는 C#에서 나는 더 많은 것을 가져서는 안된다. – Andrey