我们如何找到一个exe文件是.Net exe还是常规exe?

我们如何找到一个exe文件是.Net exe还是常规exe?,.net,file,exe,.net,File,Exe,可能重复: 我有一个文件名,我检查该文件是否存在于当前目录中,我的问题是我想知道该文件(该文件是可执行的)是.Net exe或常规exe。构造一个,并调用try-catch块。如果没有得到异常,则它是一个.NET程序集。这不是防弹的,但可以提供一种合理的开始方式。这里有一个类似的问题: 它说要使用微软的PEVerify工具。你可以使用这个方法。如果程序集不是.NET程序集,或者依赖于较新版本的框架,则会引发异常。只要您使用的是最新版本的框架,以下示例仅在路径不是.NET程序集时返回false

可能重复:


我有一个文件名,我检查该文件是否存在于当前目录中,我的问题是我想知道该文件(该文件是可执行的)是.Net exe或常规exe。

构造一个,并调用try-catch块。如果没有得到异常,则它是一个.NET程序集。这不是防弹的,但可以提供一种合理的开始方式。

这里有一个类似的问题:

它说要使用微软的
PEVerify工具。

你可以使用这个方法。如果程序集不是.NET程序集,或者依赖于较新版本的框架,则会引发异常。只要您使用的是最新版本的框架,以下示例仅在路径不是.NET程序集时返回false

public bool IsNetAssembly (string path)
{
    try
    {
         Assembly assembly = Assembly.LoadFrom(path);
         return true;
    }
    catch (BadImageFormatException e)
    {
         Console.WriteLine("This is either not a .NET assembly, or is " + 
                           "later than the current .NET framework");
         return false;
    }
}

您可以这样做:

try
{
    MessageBox.Show(System.Reflection.Assembly.LoadFrom(@"C:\test\csharptestapp.exe").ImageRuntimeVersion);         //Valid, will return 4.0
    MessageBox.Show(System.Reflection.Assembly.LoadFrom(@"C:\Windows\notepad.exe").ImageRuntimeVersion);            //Invalid, will throw BadImageFormatException
}
catch (BadImageFormatException ex)
{
    MessageBox.Show(ex.ToString());
}

这是一个编程问题,还是你只是问如何找到答案?相关:很难,因为操作系统不知道。.exe包含启动CLR并将程序集传递给CLR执行的代码。您可以尝试查找该代码的某些签名并在文件中查找它,或者在文件中搜索与元数据相关的签名。是否要搜索EXE文件?在我的问题中,取决于这些EXE的类型,我必须执行一些路由以获取信息。但是,如果我使用32位prog并在64位程序集上尝试这种方法,会发生什么?@Steve,当然。