问题 有没有办法强制“任何CPU”编译的应用程序在64位操作系统上以32位模式运行?


如果我有一个“任何CPU”编译的.NET应用程序,它将在64位操作系统上以64位模式运行。

但是,如果我出于某种原因想要强制这个应用程序以32位模式运行。 (好像它是使用“x86”编译的)。重新编译不是一个选项,所以可以在运行时配置吗?也许使用.manifest文件?


7084
2018-06-12 08:51


起源



答案:


我相信你可以做到这一点 CorFlags.exe

就像是:
CorFlags yourassembly.exe / 32BIT +

请注意,如果程序集是强名称,则还必须使用/ force选项来破坏强命名,因此您必须重新签名程序集。


10
2018-06-12 08:53



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


答案:


我相信你可以做到这一点 CorFlags.exe

就像是:
CorFlags yourassembly.exe / 32BIT +

请注意,如果程序集是强名称,则还必须使用/ force选项来破坏强命名,因此您必须重新签名程序集。


10
2018-06-12 08:53



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