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

ChP*_*ChP 5 c# oledb cross-platform visual-studio

论坛上有一些关于Microsoft.ACE.OLEDB.12.0提供商未在本地计算机上注册的问题(以及不需要的答案),例如这个。问题的要点,我的理解是,应用程序将在与应用程序运行的平台相同的平台上寻找提供者。因此,如果您的计算机是 64 位,而提供程序是 32 位,那么如果您不将应用程序编译为在 32 位模式下运行,就会出现不匹配的情况。

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

我正在使用运行 Windows 7、8 和 10 的电脑(均为 64 位)开发一个应用程序,具体取决于我所在的位置,但有些电脑具有较旧版本的 Office,其他电脑则具有较新版本。这导致我必须根据我当前使用的 PC 更改编译平台。虽然这对我来说不是问题,但就我个人而言,我预计这会给最终用户带来无法运行该程序的麻烦。

尽量避免要求用户在其计算机上安装其他组件;有没有办法让程序检查数据库提供程序的平台可用性,然后在该模式下运行?是否可以创建数据库模块的 32 位和 64 位扩展并加载适当的扩展,而不管主程序运行的模式如何?

编辑:

我只是尝试在不同平台上编译我的数据库扩展,无论哪一个与应用程序不是同一平台,都会在加载时引发异常,表示我正在尝试从不同平台加载程序集。所以我想我的选择2不走运......

Evk*_*Evk 2

您可以使用CorFlags实用程序修改目标计算机上的可执行文件,然后检测它需要运行哪种模式。

首先确保您的主 exe 是在任何Prefer 32 bit未设置标志的 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
Run Code Online (Sandbox Code Playgroud)

请注意,这只是示例,如果出现问题,它将陷入无限循环,请根据您的要求进行调整。该脚本的作用只是使用 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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