【发布时间】:2016-04-12 09:51:42
【问题描述】:
这不是以下 SO 问题的重复: How do I tell if a win32 application uses the .NET runtime.
如果给定的 exe 文件是 .net exe 文件还是常规的 WIN32/WIN64 exe 文件,我如何以编程方式找出?
问题不是询问正在运行的进程,而是关于 exe 文件,正如标签所示,不需要用 VB.net 或 C# 编写的解决方案。
我需要一个带有签名的函数,例如:
// return true if filename is a exe file for .Net
bool IsExeFileDotNet(LPCTSTR filename)
{
...
}
【问题讨论】:
-
可能,是的。您还可以查询 exe 的依赖项列表以确定其依赖项之一是否需要 .Net - 链可能很长,并且取决于您需要信息的目的。如果只是exe,那就更简单了,如果整个过程需要.Net,那么你需要检查所有的依赖关系。
-
.NET 可执行文件是引导 .NET 的常规 win32 应用程序。不完全确定 PE 标头是否会给出提示。
-
没有一个副本是真正详尽的。那些看起来很安全的,自己使用.NET(这个问题不是要问的)。归结为解析 PE 标头的那些没有指向官方文档的链接,甚至没有关于 OS 加载程序如何确定是否需要加载 CLR 的非官方信息。我正在投票重新开放。
-
此链接可以帮助您入门; codeproject.com/Articles/12585/The-NET-File-Format,您将需要验证“混合模式”exe(即使用
/clr编译),但您的答案可能更简单,寻找导出函数_CorExeMain。看起来标题的 MS 规范在这里; msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx