有没有一种方法可以强制一个用“Any CPU”编译的应用在64位操作系统上以32位模式运行?

12
如果我有一个使用“Any CPU”编译的.NET应用程序,它将在64位操作系统上以64位模式运行。
但是如果出于某种原因,我想强制该应用程序以32位模式运行(就像使用“x86”编译一样),重新编译不是一个选择,那么在运行时配置是否可能?也许可以通过.manifest文件实现吗?
2个回答

11

我相信你可以使用CorFlags.exe 来完成这个操作。

类似下面的命令:
CorFlags yourassembly.exe /32BIT+

请注意,如果程序集是强名称(strong named),您还必须使用 /force 选项来取消强制签名,因此您需要重新签名该程序集。


很遗憾,这并不可行。相关的应用程序是强名称并分发给最终用户(消费者),重新签名也不是一个真正的选择。太糟糕了。 - Magnus Johansson
1
您可以设置CLR跳过指定程序集的强名称验证。使用“sn.exe -Vr assemblyname”(-Vu重新启用)。显然,这必须在客户机上运行。但我不建议这样做,因为禁用强名称验证基本上会在CLR中打开一个安全漏洞,任何程序集都可以复制到您的应用程序中,并自动获得完全信任(请参阅:http://msdn.microsoft.com/en-us/library/k5b5tt23.aspx)。我的建议是不要去碰它,找到重新编译的方法,或者干脆不要这么做。 - Simon P Stevens
@Simon P.Stevens,我完全同意你的观点。我希望它可以成为一个我可以分发的清单文件中的条目。但似乎不是这种情况。 - Magnus Johansson
1
我认为corflags字段在清单文件中,但是清单文件也构成了签名程序集的一部分,因此对其进行更改将破坏签名。我想可能可以分发一个单独的清单文件,并以某种方式让你的应用程序忽略其中嵌入的清单文件。也许这是你可以尝试的事情。请看这里:http://blogs.msdn.com/dsvc/archive/2008/06/28/x86-x64-ia64-any-cpu.aspx它提到了清单文件中的实际字段。如果你成功了,请告诉我。我会非常感兴趣你是怎么做到的。 - Simon P Stevens

1

我有一个新的解决方案!

编写自定义的.NET宿主是这个问题的更好解决方案。因为宿主是本地应用程序,如果您将其编译为32/64位应用程序,则加载的程序集将在32/64位模式下运行。

不需要担心托管,因为.NET构建过程提供默认宿主来运行.NET应用程序。但在某些特殊情况下,明确地托管.NET运行时可能会很有用。

因此,您可以准备两个宿主(C ++应用程序),一个构建为32位应用程序,另一个构建为64位。并制作一个启动器(exe或脚本),以调用您喜欢的模式的宿主。宿主将以与主机相同的模式加载和运行您的程序集。

关于托管Core CLR,有一个教程: 编写自定义.NET Core宿主以控制.NET运行时从您的本机代码

如果您的程序集是.net框架应用程序,请参阅正确托管CLR


离题了,问题中明确说明“重新编译不是一个选项”。 - arslan2012
1
@arslan2012 汇编代码不需要重新编译,主机是一个额外的应用程序,负责加载和运行汇编代码。你的汇编代码保持原样即可。 - anchur
有趣。这个问题发布已经超过11年了。自那时以来,许多事情已经发生了,所以我不记得确切的情况,也不知道当时是否适用。 - Magnus Johansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接