我有一个.NET程序集的任意列表。
我需要以编程方式检查每个DLL是否针对x86(而不是x64或Any CPU)构建的。这可能吗?
看System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)
您可以从返回的AssemblyName实例检查程序集元数据:
使用PowerShell:
[36] C:\> [reflection.assemblyname] :: GetAssemblyName(“ $ {pwd} \ Microsoft.GLEE.dll”)| FL名称:Microsoft.GLEE版本:1.0.0.0CultureInfo:代码库:file:/// C:/ projects / powershell / BuildAnalyzer / ...EscapedCodeBase:file:/// C:/ projects / powershell / BuildAnalyzer / ...ProcessorArchitecture:MSIL标志:公钥哈希算法:SHA1版本兼容性:SameMachine密钥对:FullName:Microsoft.GLEE,Version = 1.0.0.0,Culture = neut ...
这里,ProcessorArchitecture标识目标平台。
在此示例中,我使用PowerShell来调用该方法。
您可以使用CorFlags CLI工具(例如C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ CorFlags.exe)来根据程序集的输出确定程序集的状态并将打开的程序集作为二进制资产,您应该能够确定需要在哪里确定32BIT标志是设置为1(x86还是0(Any CPU或x64]) >,取决于PE
):
Option | PE | 32BIT
----------|-------|---------
x86 | PE32 | 1
Any CPU | PE32 | 0
x64 | PE32+ | 0
包含有关corflags
的一些信息。甚至更好,您可以use Module.GetPEKind
来确定程序集是Module.GetPEKind
值PortableExecutableKinds
(64位),PE32Plus
(32位和WOW)还是Required32Bit
(任何CPU)以及其他属性。
仅作说明,CorFlags.exe是ILOnly
的一部分。我的机器上有开发工具,确定DLL是否仅是32位的最简单方法是:
你只写你自己的怎么样?自从Windows 95中实施以来,PE体系结构的核心并未发生重大变化。这是一个C#示例:
尝试使用CorFlagsReader 0x10B - PE32 format.
0x20B - PE32+ format.
。它没有对其他程序集的引用,可以按原样使用。
JetBrians的DotPeek提供了快速简便的方法来查看msil(anycpu),x86,x64from this project at CodePlex
下面是一个批处理文件,它将对当前工作目录和所有子目录中的所有[TestMethod]
public void EnsureKWLLibrariesAreAll64Bit()
{
var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies().Where(x => x.FullName.StartsWith("YourCommonProjectName")).ToArray();
foreach (var assembly in assemblies)
{
var myAssemblyName = AssemblyName.GetAssemblyName(assembly.FullName.Split(',')[0] + ".dll");
Assert.AreEqual(ProcessorArchitecture.MSIL, myAssemblyName.ProcessorArchitecture);
}
}
和corflags.exe
运行dlls
,解析结果并显示每个目标的体系结构。
另一种方法是在DLL上使用Visual Studio工具中的dumpbin并寻找适当的输出
[更通用的方式-使用文件结构确定位数和图像类型:
我克隆了一个超级方便的工具,该工具在Windows资源管理器中为程序集添加了一个上下文菜单项,以显示所有可用信息:
cfeduke注意到可以调用GetPEKind。在PowerShell中执行此操作可能很有趣。
您可以在此处找到更高级的应用程序:PowerShell Community Extensions