2010-08-13 87 views
0

我希望能够分发用户可以配置为以32位或64位方式运行的一个版本的可执行文件。该服务将有一个32位的主机进程,用于读取配置并启动32或64位的新进程。我没有确定的是如何/如果针对任何CPU的可执行文件可以在64位Windows下作为32位进程启动。在64位Windows上以32位进程启动MSIL exe

回答

2

这没有什么意义。如果您的应用程序可以作为32位进程运行,并且不需要额外的虚拟内存空间,那么将它作为64位进程运行就没有意义了。

你也不能轻易控制它。它需要更改.exe标头中的值。 Corflags.exe实用程序可以执行此操作,但不能分发它。自己砍头是技术上可行的,但很难很难 fugly。最终的障碍是,您通常不具有在正确安全的机器(例如UAC)上修改.exe文件所需的写入权限。如果你真的需要这样做,那么只需部署两个副本的.exe

这可以通过编写一个非常小的引导程序.exe来完成。它所需要做的就是Assembly.Load()主要的.exe,并调用它的Program.Main()方法。构建它的两个版本。

+0

我知道它可以强制这种方式,这是行不通的。对于大多数用途而言,64位将是首选,但对于某些向后兼容性场景,可能需要32位。部署2个副本是默认位置,但我希望有另一种方法。 – dmo 2010-08-13 19:13:46

+2

所有你需要的是一个非常麻烦的引导程序EXE。它可以Assembly.Load()主EXE并调用它的Program.Main()方法。 – 2010-08-13 19:31:52

+0

谢谢,汉斯 - 这可能是一个合理的方法。 – dmo 2010-08-13 22:23:35

0

定位任何CPU意味着您的目标是构建机器的操作系统。因此,如果您的构建机器是32位的,那么任何CPU将构建一个32位输出,并且如果您的构建机器是64位,那么您将获得64位输出。这与您部署到的机器无关。

为了达到你想要做的,你真的需要2个exe副本,一个是32位版本,另一个是64位版本。您可以通过将目标平台分别设置为32位和64位来完成此操作。再一次,如果您的目标是任何CPU,Visual Studio将选择构建机器上当前的任何操作系统。

+0

将任何一个CPU目标库加载到32位进程中将生成32位。所以64位机器*可以*构建32位代码。我只是想知道是否有可能在新的过程中强制这一点。 – dmo 2010-08-13 18:34:16

+0

这就是我的观点,它会**构建**,这意味着输出二进制将是32位或64位,从来都不是。因此,如何以32位进程的形式启动64位构建的二进制文件?唯一的办法是同时拥有32/64位版本和每个配置文件启动一个版本。 – code4life 2010-08-13 21:25:25

+0

MSIL在运行时编译为本地代码(32位或64位)。问题是如何指导要构建的64位操作系统。如果项目编译为明确的32位或64位,则运行时将尊重该项目。如果在正在运行的进程中加载​​,它将尝试使用与托管进程相同的方式。 .NET二进制文件被编译为MSIL,因此它们可以在任何主体中运行。 – dmo 2010-08-13 22:22:38

相关问题