如何知道dll文件是面向32位系统还是面向64位系统的?
在发布dll时,可以选择编译为x86模式、x64模式以及Any Cpu模式等。那么对于已经发布的dll文件,怎么知道它是支持什么系统的呢?
方法一:
简便方法:
直接用记事本或者notepad++打开exe文件(dll文件),会有很多乱码,不要头疼,接下来只需要在第二段中找到PE两个字母,在其后的不远出会出现d? 或者L。若是d,则证明该程序是64位;若是L,则证明是32位。
方法二:
我们可以通过dll的PE Image File中指定位置的字节来判断dll文件是x86的还是x64的。如下是代码示例:
public static ushort GetPEArchitecture(string filePath)
{
ushort architecture = 0;
try
{
using (System.IO.FileStream fStream = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
using (System.IO.BinaryReader bReader = new System.IO.BinaryReader(fStream))
{
if (bReader.ReadUInt16() == 23117) //check the MZ signature
{
fStream.Seek(0x3A, System.IO.SeekOrigin.Current); //seek to e_lfanew.
fStream.Seek(bReader.ReadUInt32(), System.IO.SeekOrigin.Begin); //seek to the start of the NT header.
if (bReader.ReadUInt32() == 17744) //check the PE\0\0 signature.
{
fStream.Seek(20, System.IO.SeekOrigin.Current);//seek past the file header,
architecture = bReader.ReadUInt16(); //read the magic number of the optional header.
}
}
}
}
}
catch { }
return architecture;
}
执行上面的代码会返回下面两种可能的结果:
12 0x10b - PE32
0x20b - PE32+
前者是x86的后者是x64的。
方法三:Reflector
对于.Net dll文件,用Reflector工具可进行辨别:
其中的Platform Target就指明了该dll在编译时选择的目标系统。
方法四:CorFlags.exe工具
使用Vistual Studio.Net自带的corflags工具,先打开vs.net 命令窗口:
输入coreflags :
其中PE和32BIT的值可以看出该dll支持的系统位数:
anycpu: PE = PE32 and 32BIT = 0
x86: PE = PE32 and 32BIT = 1
x64: PE = PE32+ and 32BIT = 0
(可参考:http://blogs.msdn.com/b/gauravseth/archive/2006/03/07/545104.aspx)