我如何解释CorFlags标志以及如何使用它来确定.NET程序集是为x86还是x64构建的?
可能是以下情况?
corflags MyAssembly.dll
Run Code Online (Sandbox Code Playgroud) 在某些DLL文件上运行CorFlags时,有些显示为PE32,有些显示为PE32 +.有什么不同?
我在哪里可以找到CorFlags.exe工具?我完全搜索了我的硬盘驱动器,但没有找到.
我有:.NET Framework 4.0,Visual C#2010 Express,Visual C++ 2010 Express.操作系统是Windows 7旗舰版32位.
我正在运行Windows Server 2008 64位"工作站",并希望获得corflags.exe.我需要下载哪个SDK?
我知道.NET Framework 2.0软件开发工具包(SDK)(x64)和Windows SDK for Windows Server 2008和.NET Framework 3.5但我希望找到更小的东西,因为这些是非常大的下载.
关于2.0 SDK的说明似乎建议下载3.5一个,我应该遵循吗?
我想我的问题是关于CLR Loader.我想了解CorFlags.exe /32BIT+
功能背后的机制.
我们知道当一个人开始使用在64位Windows上设置的Any CPU标志编译的程序集时,它将以64位进程启动.如果CorFlags /32BIT+
在该程序集上运行,它将以32位进程启动.我认为这是一个引人入胜的特征.
我有很多问题:
是否有文章,书籍,博客等解释了此功能的内部工作原理?
我正在搞乱一些相当低级别的东西,并试图确定为什么我使用CorFlags.exe实用程序得到不同的输出.作为参考,输出如下:
$ corflags test2.exe Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.17929 Copyright (c) Microsoft Corporation. All rights reserved. Version : v4.0.30319 CLR Header: 2.5 PE : PE32 CorFlags : 0x1 ILONLY : 1 32BITREQ : 0 32BITPREF : 0 Signed : 0 $ corflags test.exe Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.17929 Copyright (c) Microsoft Corporation. All rights reserved. Version : v4.0.30319 CLR Header: 2.5 PE : PE32 CorFlags : 0x20003 ILONLY : 1 32BITREQ : …
我试图在Win7 x64上运行我的.NET 3.5 WinForms应用程序.该应用程序使用NHibernate和System.Data.OracleClient来访问Oracle数据库.Oracle客户端是32位.
启动应用程序时,我收到以下错误消息
尝试加载Oracle客户端库会引发BadImageFormatException.在安装了32位Oracle客户端组件的64位模式下运行时,将发生此问题.
为此,我将构建目标定位到x86平台:
令我惊讶的是,尝试在Win7平台上执行新版本时出现了相同的错误消息.
NHibernate程序集在运行时加载Assembly.Load("...");
.
可能是NHibernate DLL仍然以64位模式运行,而主机exe以32位模式运行.这听起来很奇怪.或者可能是因为某种原因,我的应用程序运行在64位模式,即使它的目标是x86?
更新:
我使用CorFlags检查了我的二进制文件,它标记为32位:
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 3
ILONLY : 1
32BIT : 1
Signed : 0
Run Code Online (Sandbox Code Playgroud)
我也在任务管理器中检查了它,它有一个*32
后缀.
我还尝试并使用CorFlags将32位标志添加到我的应用程序附带的所有程序集.它仍会产生相同的错误消息.
我很困惑......困惑......困惑......
如果我要说的任何内容毫无意义或忽视了一些显而易见的东西,那么道歉 - 我对CLR内部的了解是不稳定的.
如果我理解正确,那么如果我只是在VS2K5中为'AnyCPU'构建一个解决方案(或者使用这些设置指向那个.sln文件的MSBuild),那么二进制文件只能编译到MSIL.然后,如果在32位平台上执行,它们会被JIT打成32位,如果在x64上执行,它们会被64位代码...对吧?
这些DLL用于Web应用程序并托管在W3WP.exe进程中.Process Explorer告诉我W3WP是一个64位进程.
但是当我使用Process Explorer在DLL视图中检查其中一个DLL的属性时,它会显示:'Image:32-bit'.是什么赋予了?
如果我对有问题的DLL运行corflags它会告诉我:ILONLY 1,32BIT 0但是PE PE32.我的理解是,这意味着它只是编译到IL,不是它不限于32位或64位,但我不完全清楚.PE32标志是否与它上面显示的32位有关?
我有一个遇到此问题的Windows服务。
Version : v4.0.30319
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
Run Code Online (Sandbox Code Playgroud)
我什至尝试使用32BITREQ-
和32BITPREF-
标志运行Corflags以确保将其设置为应该的值,但没有骰子。在taskManager中,它显示为:
MyServiceName(32位)
该服务与Topshelf 3.0一起安装,并且在Windows Server 2012 R2 Standard上运行。这里发生了什么?
我试图使用Corflags让PartCover在x64下运行.我用的时候:
CorFlags.exe PartCover.exe/32BIT +/Force
我得到:corflags:警告CF011:指定的文件是强名称签名.使用/ Force将使此图像的签名无效,并且需要对程序集进行重新签名.
没有/强迫我得到:
corflags:错误CF012:指定的文件是强名称签名.使用/强制强制更新.
在网上看来,其他人在没有问题的情况下通过corflag运行partcover ...
我需要编写类似CorFlags的应用程序.如果我有一个汇编文件的路径,如何读取它的CorFlags?
我特别需要知道程序集是Any-CPU还是x86
我想避免使用反射加载程序集,因为我需要扫描许多文件.