在“任何CPU”.NET程序集上强制执行x86 CLR
在.NET中,“平台目标:任何CPU”编译器选项允许.NET程序集在x64机器上以64位运行,在x86机器上以32位运行。 使用'Platform Target:x86'编译器选项,还可以强制程序集在x64机器上以x86形式运行。
是否有可能使用“任何CPU”标志运行程序集,但确定它是否应该在x86或x64 CLR中运行? 通常,这个决定是由CLR / OS Loader(根据我的理解)根据底层系统的位数作出的。
我正在尝试编写一个可以与其他正在运行的进程进行交互的C#.NET应用程序(读取代码)。 x64进程只能注入到其他x64进程中,并且与x86一样。 理想情况下,我想利用JIT编译和Any CPU选项来允许单个应用程序用于注入x64或x86进程(在x64机器上)。
这个想法是,该应用程序将被编译为任何CPU。 在x64机器上,它将以x64运行。 如果目标进程是x86,则它应该自行重新启动,强制CLR将其作为x86运行。 这可能吗?
您可以找到应用程序如何运行并使用CorFlags应用程序静态更改它。 要了解应用程序的运行方式,请使用:
corflags <PathToExe>
要更改应用程序的运行方式,请使用:
corflags /32bit+ <PathToExe>
这将使EXE文件以32位进程运行。 有关组件应如何运行的信息存储在PE标头中。 请参阅堆栈溢出问题如何查找本机DLL文件是否被编译为x64或x86?
如果你想在运行时注入代码,你必须在C ++ / COM中编写一个.NET分析器。 有关更多详细信息,请参见.NET内部:分析API和分析(非托管API参考)。
你需要实现JitCompilationStarted回调并在那里完成你的工作。 如果你在这个方向上,你将不得不建立注入DLL文件为x86和x64。 一旦设置了以下环境变量,本地DLL文件将由CLR加载:
Cor_Enable_Profiling=0x1
COR_PROFILER={CLSID-of-your-native-DLL-file}
如果你设置正确,那么64位版本将会'看到'64位进程,而32位版本会'看到'32位进程。
自从我尝试这个以来已经有一段时间了,但是我相信调用程序集的进程的缺点决定了它是否会被打成x86或x64。
因此,如果您编写一个小型控制台应用程序并将其构建为x86,另一个作为x64,则运行其中一个或另一个将导致其他程序集加载到该进程中以32位或64位运行。 当然,这是假定您在64位机器上运行。
我不确定我是否可以帮助你。 但这是我的经验。
我有一个主机应用程序, A.exe
(编译为x86),并且有一个客户端应用程序B.exe
(编译为ANY CPU
)。 我使用System.Diagnostic.Process类从A.exe
启动B.exe
。
现在的问题是如果我把这两个放在一台x64机器上,那么A.exe
将以x86运行, 而B.exe
将以x64运行 。
但是,如果A.exe
调用程序集c( c.dll
,它被编译为Any CPU
),并且B.exe
也调用c.dll
,那么c.dll将遵循调用它的应用程序。 换句话说,在A.exe
调用它的64位机器中,它的行为与x86
dll类似,而当B.exe
调用它时,它的行为将与x64
类似。