c#visual studio build exe with target anycpu但是在调用进程平台(x86/x64)上确定了它的平台(x86/x64)

VSP*_*VSP 8 c# x86 target-platform anycpu visual-studio-2015

我们有一个32位和64位的软件,它们调用我们的exe并将事件传递给它(就像一个插件).

问题是我们的exe必须以与调用软件相同的位(x86/x64)执行(如果软件以32位版本运行,我们的exe必须以32位运行,如果软件运行在64位版本我们的exe必须以64位运行).Windows版本是64位,但客户端可以运行32位版本或64位版本的软件.

在visual studio(2015)中,Target AnyCPU选项仅取决于Windows版本(+ Prefer 32位复选框),但我们需要依赖于调用软件Process.

我们可以实现任何选项或解决方案而不是编译到每个平台(x86和x64)吗?

Tim*_*Tim 4

Windows 操作系统不要求两个单独的进程必须具有相同的位数才能相互通信,因此我假设您有一些内部要求,要求两个进程具有相同的位数。如果您绝对必须在 32 位或 64 位中动态运行相同的 EXE 并在运行时做出决定,则可以使用Visual Studio 附带的corflags.exe实用程序在运行时修改 AnyCPU 编译的应用程序。

您可以像这样启动 corflags.exe (使用 System.Diagnostic.Process):

corflags.exe "ourapp.exe" /32BIT+
Run Code Online (Sandbox Code Playgroud)

强制它运行 32 位,并且

corflags.exe "ourapp.exe" /32BIT-
Run Code Online (Sandbox Code Playgroud)

返回到 AnyCPU(在 64 位操作系统上将是 64 位)

解决方案是在运行时环境中部署 corflags.exe 的副本。然后,您的主机应用程序可以通过检查 sizeof(IntPtr) 来检测它的当前位数,看看它是 8 还是 4;并在启动 ourapp.exe 之前相应地生成 corflags.exe 的副本(使用 System.Diagnostics.Process)。

这非常HACKY。当心。显然,如果您需要在同一台计算机上同时运行 ourapp.exe 的两个副本,您将会遇到很多麻烦。理想的做法是在修改 ourapp.exe 并从那里启动它之前,将其唯一副本创建到本地用户文件夹,以避免多个实例和 UAC 提示(具体取决于您的目标环境)的竞争条件。