C# 如何基于外部资源以64位或32位模式有条件地运行程序?

C# 如何基于外部资源以64位或32位模式有条件地运行程序?,c#,visual-studio,cross-platform,oledb,C#,Visual Studio,Cross Platform,Oledb,关于Microsoft.ACE.OLEDB.12.0provider未在本地计算机上注册,论坛上到处都有一些问题(和不需要的答案),如。问题的要点,我的理解是,应用程序将在与应用程序运行的平台相同的平台上查找提供者。因此,如果您的计算机是64位的,而提供程序是32位的,那么如果您不将应用程序编译为以32位模式运行,则会出现不匹配 大多数答案通过为当前平台安装适当的数据组件有效地解决了这一问题。其他建议是针对数据组件可用的平台进行编译 我正在使用运行Windows7、8和10的PC开发一个应用程序

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

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

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

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

编辑:

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

在检测到目标机器需要运行哪种模式后,您可以使用该实用程序修改目标机器上的可执行文件

首先,确保主exe在未设置
首选32位
标志的任何cpu下编译。现在,当应用程序启动时,您需要检查我们是否处于64位进程中,还需要检查您的依赖关系(我将不介绍这一点-我不使用OLEDB)。若您发现不匹配(假设您在64位进程中运行,但依赖项是32位的)—您需要运行外部进程来修改主可执行文件,然后重新启动它。最简单的方法是通过简单的cmd脚本,如下所示(在本例中,我的主exe名为
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中可用,因此您可能希望将其与应用程序打包在一起(可能在远程计算机上不可用)。

您不必检测它是哪种平台。只需使用
Platform=AnyCPU
选项编译您的项目。@MaciejLos我发现,只有当数据提供程序平台与Windows相同时,此选项才有效,否则应用程序将在Windows平台上运行,并且不会检测到提供程序
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");
    }
}