如何检查Windows系统上安装了多少.Net应用程序?

时间:2011-10-10 12:16:33

标签: .net windows

我正在阅读Jeffrey Richter的应用Microsoft .NET Framework编程。

我想知道在Windows系统上安装了多少.Net应用程序的常用方法是什么。

你可以建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这几乎是不可能找到的。您怎么知道,安装了多少普通应用程序?什么是应用程序,部分用DotNet编写?是用DotNet编写的库是一个应用程序吗?

答案 1 :(得分:1)

您可以编写一个程序,该程序通过磁盘运行并扫描.EXEs文件,尝试确定是.NET还是本机。这是一段C#代码,可以确定文件是否是.NET文件(DLL或EXE):

public static bool IsDotNetFile(string filePath)
{
    if (filePath == null)
        throw new ArgumentNullException("filePath");

    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        using (BinaryReader br = new BinaryReader(fs))
        {
            if (br.ReadUInt16() != 0x5A4D) // IMAGE_DOS_SIGNATURE
                return false;

            byte[] bytes = new byte[112]; // max size we'll need
            const int dosHeaderSize = (30 - 1) * 2; // see IMAGE_DOS_HEADER
            if (br.Read(bytes, 0, dosHeaderSize) < dosHeaderSize)
                return false;

            fs.Seek(br.ReadUInt32(), SeekOrigin.Begin);
            if (br.ReadUInt32() != 0x4550) // IMAGE_NT_SIGNATURE
                return false;

            // get machine type
            ushort machine = br.ReadUInt16(); // see IMAGE_FILE_HEADER

            br.Read(bytes, 0, 20 - 2); // skip the rest of IMAGE_FILE_HEADER

            // skip IMAGE_OPTIONAL_HEADER
            if (machine == 0x8664) //IMAGE_FILE_MACHINE_AMD64
            {
                br.Read(bytes, 0, 112); // IMAGE_OPTIONAL_HEADER64
            }
            else
            {
                br.Read(bytes, 0, 96); // IMAGE_OPTIONAL_HEADER32
            }

            // skip 14 data directories, and get to the IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, the 15th one
            br.Read(bytes, 0, 14 * 8);

            // if the COR descriptor size is 0, it's not .NET
            uint va = br.ReadUInt32();
            uint size = br.ReadUInt32();
            return size > 0;
        }
    }
}

它基于PE标准文件格式分析,但仅关注.NET确定。在此处详细了解:An In-Depth Look into the Win32 Portable Executable File Format