我正在阅读Jeffrey Richter的应用Microsoft .NET Framework编程。
我想知道在Windows系统上安装了多少.Net应用程序的常用方法是什么。
你可以建议吗?谢谢!
答案 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