在“任何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类似。

链接地址: http://www.djcxy.com/p/29101.html

上一篇: Force x86 CLR on an 'Any CPU' .NET assembly

下一篇: Why doesn't Edit and Continue work on the x64 CLR?