代码之家  ›  专栏  ›  技术社区  ›  ElektroStudios

确定装配类型的好方法?

  •  1
  • ElektroStudios  · 技术社区  · 6 年前

    PEFileKinds 反射

    我发现 this 解决方案(该问题中提出的其他解决方案是无效的),但是如果我没有错的话,我认为这意味着假设加载的文件是一个.NET程序集,手动解析PE头似乎有点整洁。

    我还发现 this other 但阅读评论在某些情况下似乎并不有效。

    反射 ,以确定加载程序集的PE文件类型。

    我敢肯定 System.Reflection.Emit.PEFileKinds 枚举的存在不仅仅是为了装饰目的,如果该枚举存在,那么它的逻辑就是认为在 反射 Assembly 课程结束 反射

    1 回复  |  直到 6 年前
        1
  •  2
  •   Joe Sewell    6 年前

    根据 a search of the reference source ,的 PEFileKinds 枚举仅用于 AssemblyBuilder ModuleBuilder (以及它们的非公共助手类型)。此枚举和类位于 System.Reflection.Emit namespace

    然而, the official System.Reflection.Metadata NuGet package 在程序集中显示程序集的PE头的相关值 System.Reflection.PortableExecutable namespace 培林 价值观。下面是C#中的一个例子:

    using (var stream = File.OpenRead(filenameAndExtension))
    {
        using (var peFile = new PEReader(stream))
        {
            var headers = peFile.PEHeaders;
            Console.WriteLine($"Reading {filenameAndExtension} with System.Reflection.Metadata");
            Console.WriteLine($"  IsDll: {headers.IsDll}");
            Console.WriteLine($"  IsExe: {headers.IsExe}");
            Console.WriteLine($"  IsConsoleApplication: {headers.IsConsoleApplication}");
    
            PEFileKinds reverseEngineeredKind;
    
            // NOTE: the header values cause IsConsoleApplication to return
            //       true for DLLs, so we need to check IsDll first
            if (headers.IsDll)
            {
                reverseEngineeredKind = PEFileKinds.Dll;
            }
            else if (headers.IsConsoleApplication)
            {
                reverseEngineeredKind = PEFileKinds.ConsoleApplication;
            }
            else
            {
                reverseEngineeredKind = PEFileKinds.WindowApplication;
            }
            Console.WriteLine($"  Reverse-engineered kind: {reverseEngineeredKind}");
        }
    }
    

    我在生成的程序集上运行了这段代码 系统反射发射 以确保其准确性。完整的程序正在运行 this gist .

    您也可以通过第三方库获取这些信息,如 Mono.Cecil 或者,正如莱克斯李提到的, PeNet