检查非托管 DLL 是 32 位还是 64 位?
如何在 C# 中以编程方式判断非托管 DLL 文件是 x86 还是 x64?
How can I programmatically tell in C# if an unmanaged DLL file is x86 or x64?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
请参阅规范。 这是一个基本实现:
MachineType
枚举定义为:我只需要其中三个,但为了完整性我将它们全部包含在内。 最终 64 位检查:
Refer to the specifications. Here's a basic implementation:
The
MachineType
enum is defined as:I only needed three of these, but I included them all for completeness. Final 64-bit check:
使用 Visual Studio 命令提示符, dumpbin /headers dllname.dll 也可以工作。 在我的机器上,输出的开头指出:
Using a Visual Studio command prompt, dumpbin /headers dllname.dll works too. On my machine the beginning of the output stated:
更简单:查看 System.Reflection.Module 类。 它包括 GetPEKind 方法,该方法返回 2 个描述代码类型和 CPU 目标的枚举。 不再有十六进制!
(这篇内容非常丰富的文章的其余部分是从 http: //www.developersdex.com/vb/message.asp?p=2924&r=6413567)
示例代码:
PortableExecutableKinds 可用于检查哪种程序集。 它
有 5 个值:
ILOnly:可执行文件仅包含 Microsoft 中间语言
(MSIL),因此对于 32 位或 64 位而言是中性的
平台。
NotAPortableExecutableImage:该文件不在可移植可执行文件 (PE) 中
文件格式。
PE32Plus:可执行文件需要 64 位平台。
required32Bit:可执行文件可以在 32 位平台上运行,或者在
64 位平台上的 32 位 Windows on Windows (WOW) 环境。
非托管32位:可执行文件包含纯非托管代码。
以下是链接:
Module.GetPEKind 方法:
http://msdn.microsoft.com/en- us/library/system.reflection.module.getpekind.aspx
PortableExecutableKinds 枚举:
http://msdn.microsoft.com /en-us/library/system.reflection.portableexecutablekinds(VS.80).aspx
ImageFileMachine 枚举:
http://msdn.microsoft.com/en-us/库/system.reflection.imagefilemachine.aspx
Even easier: check out the System.Reflection.Module class. It includes the GetPEKind method, which returns 2 enums that describe the type of code and the CPU target. No more hex!
(the rest of this very informative post was copied shamelessly from http://www.developersdex.com/vb/message.asp?p=2924&r=6413567)
Sample code:
PortableExecutableKinds can be used to check what kind of the assembly. It
has 5 values:
ILOnly: The executable contains only Microsoft intermediate language
(MSIL), and is therefore neutral with respect to 32-bit or 64-bit
platforms.
NotAPortableExecutableImage: The file is not in portable executable (PE)
file format.
PE32Plus: The executable requires a 64-bit platform.
Required32Bit: The executable can be run on a 32-bit platform, or in the
32-bit Windows on Windows (WOW) environment on a 64-bit platform.
Unmanaged32Bit: The executable contains pure unmanaged code.
Following are the links:
Module.GetPEKind Method:
http://msdn.microsoft.com/en-us/library/system.reflection.module.getpekind.aspx
PortableExecutableKinds Enumeration:
http://msdn.microsoft.com/en-us/library/system.reflection.portableexecutablekinds(VS.80).aspx
ImageFileMachine Enumeration:
http://msdn.microsoft.com/en-us/library/system.reflection.imagefilemachine.aspx
使用
Assembly.ReflectionOnlyLoadFrom
,而不是Assembly.LoadFile
。 这将使您能够解决“错误图像格式”异常。Instead of
Assembly.LoadFile
, useAssembly.ReflectionOnlyLoadFrom
. This will let you work around the "Bad Image Format" exceptions.我知道自从更新以来已经有一段时间了。 通过将文件加载到它自己的 AppDomain 中,我能够摆脱“错误图像格式”异常。
此时,我执行以下操作:
针对我的 Widows\Assembly 目录运行此命令,处理的文件数超过 3600 个,结果为零错误。
注意:我使用字典来加载返回的值。
我希望它有帮助。 青年MMV
I know it has been a while since this was updated. I was able to get away with the "Bad Image Format" exceptions by loading the file into it's own AppDomain.
At this point, I do the following:
Running this against my Widows\Assembly directory gives me zero errors with over 3600 files processed.
note: I use a dictionary to load the values being returned.
I hope it helps. YMMV