c# – 如何根据外部资源以64位或32位模式有条件地运行程序?

关于Microsoft.ACE.OLEDB.12.0提供程序的论坛中有一些问题(和不需要的答案)没有在本地机器上注册,如
this one.问题的关键,我的理解,是应用程序将在与运行应用程序相同的平台上查找提供程序.因此,如果您的计算机是64位且提供程序是32位,那么如果您不编译应用程序以在32位模式下运行,则会出现不匹配.

大多数答案通过为当前平台安装适当的数据组件来有效地解决这个问题.其他建议是针对数据组件可用的任何平台进行编译.

我正在使用运行Windows 7,8和10,全部64位的PC开发应用程序,具体取决于我的位置,但有些版本的Office版本较旧,而其他版本较新.这导致我必须根据我目前正在处理的PC更改我编译的平台.虽然这对我来说没有问题,但我个人认为这会让最终用户无法运行该程序.

Trying to avoid asking users to install other components on their computers; is there a way I can tell the program to check the platform availability of the database provider and then run in that mode? Might it be possible to create 32 bit and 64 bit extensions of the database module and load the appropriate one regardless of the mode the main program is running in?

编辑:

我只是尝试在不同的平台上编译我的数据库扩展.无论哪个与应用程序不同的平台在加载时都会导致异常,说我试图从不同的平台加载程序集.所以我想我的选择2运气不好…

最佳答案 在检测到需要运行的模式后,可以使用
CorFlags实用程序在目标计算机上修改可执行文件.

首先确保你的主exe在任何没有设置Prefer 32位标志的cpu下编译.现在,当应用程序启动时,您需要检查我们是否处于64位进程,并检查您的依赖项(我不会介绍 – 我不使用OLEDB).如果您发现不匹配(假设您在64位进程中运行但依赖项是32位) – 您需要运行外部进程来修改主可执行文件,然后重新启动它.最简单的方法是通过简单的cmd脚本,就像这样(在这个例子中,我的主要exe被称为ConsoleApplication3.exe):

:start
start /wait "" "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\CorFlags.exe" ConsoleApplication3.exe /32BIT+
if errorlevel 1 (
    goto start
)
start "" ConsoleApplication3.exe

请注意,这只是示例,如果出现问题,它将陷入无限循环,根据您的要求进行调整.这个脚本的作用就是使用CorFlags工具更新你的exe以在32位模式下运行,然后启动你的主exe.

在开始申请后,您可以进行以下检查:

static void Main() {
    if (Environment.Is64BitProcess) {
        // here you also check if you have dependency mismatch, and then:
        Console.WriteLine("Running in 64-bit mode. Press any key to fix");
        Console.ReadKey();
        // run script (here we assume script is in the same directory as main executable, and is called fix-mode.cmd
        var process = new Process() {
            StartInfo = new ProcessStartInfo("cmd.exe", "/c call fix-mode.cmd")
        };
        process.Start();                
        // here you should exit your application immediatly, so that CorFlags can update it (since it cannot do that while it is running)
    }
    else {
        // after restart by our script - we will get here
        Console.WriteLine("Running in 32bit mode");
    }
}

请注意,此工具(CorFlags)仅适用于Visual Studio,因此您可能希望将其与应用程序一起打包(可能在远程计算机上不可用).

点赞