本文介绍了如何确定一个给定的.NET程序集使用的子系统?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在C#应用程序,我想确定其他.NET应用程序是一个控制台应用程序或没有。



可以这样使用的反射API做了什么?



编辑:好的,它看起来并不像我要得到一个很好的回答这个问题,因为它看起来并不像该框架公开的功能我想。我在PE / COFF规范周围挖以及与此想出了:

  ///<总结> 
///解析PE头,并确定给定的程序集是否是一个控制台应用程序。
///< /总结>
///< PARAM NAME =assemblyPath>在组装,检查的路径< /参数>
///<退货和GT;如果给定的程序集是控制台应用程序;否则为false< /回报>
///<说明>在幻数在这个方法是从PE / COFF文件
///格式可从http://www.microsoft.com/whdc/system/规范提取平台/固件/ pecoff.mspx
///< /言论>
布尔AssemblyUsesConsoleSubsystem(字符串assemblyPath)使用
{
(VAR S =新的FileStream(assemblyPath,FileMode.Open,FileAccess.Read))
{
VAR rawPeSignatureOffset =新的字节[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;
变种coffHeader =新的字节[24];
s.Seek(peSignatureOffset,SeekOrigin.Begin);
s.Read(coffHeader,0,24);
字节[] =签名{(字节)'P',(字节)'E',(字节)'\0',(字节)\0'};
为(INT指数= 0;指数4;;指数++)
{
Assert.That(coffHeader [指数],Is.EqualTo(签名[指数]),
尝试检查一个非PE文件为控制台子系统!);
}
变种subsystemBytes =新的字节[2];
s.Seek(68 SeekOrigin.Current);
s.Read(subsystemBytes,0,2);
INT子系统= subsystemBytes [0] | subsystemBytes [1];&下; 8;
返回子系统== 3; / * IMAGE_SUBSYSTEM_WINDOWS_CUI * /
}
}


解决方案

这是出于对托管代码的范围。从.NET中的控制台,并赢得应用是一样的,你必须窥视PE文件头。在这个网页。 http://msdn.microsoft.com/ EN-US /杂志/ bb985997.aspx


In a C# application, I'd like to determine whether another .NET application is a Console application or not.

Can this be done using the reflection APIs?

EDIT: OK, it doesn't look like I'm going to get a good answer to this question because it doesn't look like the framework exposes the functionality I want. I dug around in the PE/COFF spec and came up with this:

/// <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*/
    }
}
解决方案

this is out of scope of managed code. From .net view console and win applications are same, you have to peek into PE file header. search for work "Subsystem" on this page http://msdn.microsoft.com/en-us/magazine/bb985997.aspx

这篇关于如何确定一个给定的.NET程序集使用的子系统?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-05 07:30