C# 获取系统上安装的所有Access ACE.OLEDB驱动程序的列表

C# 获取系统上安装的所有Access ACE.OLEDB驱动程序的列表,c#,ms-office,oledb,C#,Ms Office,Oledb,使用以下代码,我可以枚举在我的系统上注册的OLEDB提供程序 static void DisplayData() { var reader = OleDbEnumerator.GetRootEnumerator(); var list = new List<String>(); while (reader.Read()) { for (var i = 0; i < reader.FieldCount; i++) { if (re

使用以下代码,我可以枚举在我的系统上注册的OLEDB提供程序

static void DisplayData() {
   var reader = OleDbEnumerator.GetRootEnumerator();

   var list = new List<String>();
   while (reader.Read()) {
      for (var i = 0; i < reader.FieldCount; i++) {
         if (reader.GetName(i) == "SOURCES_NAME") {
            list.Add(reader.GetValue(i).ToString());
         }
      }
      Console.WriteLine("{0} = {1}", reader.GetName(0), reader.GetValue(0));
   }
   reader.Close();
}
static void DisplayData(){
var reader=OleDbEnumerator.GetRootEnumerator();
var list=新列表();
while(reader.Read()){
对于(变量i=0;i
它返回驱动程序列表(我们对访问驱动程序感兴趣),并附带一条警告

针对.net 4.5,它包含:

SOURCES_NAME=Microsoft.ACE.OLEDB.15.0

但是,当项目基于.net 4.0构建时,输出为:

SOURCES_NAME=Microsoft.ACE.OLEDB.12.0

我们正在测试的机器安装了32位Office 2013(其中安装了Microsoft.ACE.OLEDB.15.0)和64位版本的Access数据库驱动程序(其中安装了Microsoft.ACE.OLEDB.12.0)。我们正在运行的项目设置为AnyCPU,我们使用的是Windows 8.1

为什么枚举不总是返回相同的结果

如何获取系统上安装的所有提供商的列表?我想这样做的原因是,通常我想运行最新的驱动程序,但对于某些连接,我需要使用早期版本的驱动程序。(这是因为我有时需要升级旧的.mdb文件)因此,如果未安装旧版本,我希望通知我的用户

各种古怪:


如果我们根据.net 4.5.1创建控制台应用程序,然后将其更改为.net 4.0并运行,然后将其更改回.net 4.0,它将继续返回.net 4.0结果(Microsoft.ACE.OLEDB.12.0驱动程序)

您在这里看到的可能是.NET 4.5中引入的名为AnyCPU 32位首选设置的新子类型的影响。此子类型是新项目的新默认类型。它的意思是:

  • 如果进程在32位Windows系统上运行,则它将作为32位进程运行。IL编译为x86机器代码
  • 如果进程在64位Windows系统上运行,则它将作为32位进程运行。IL编译为x86机器代码
  • 如果进程在ARM Windows系统上运行,则它将作为32位进程运行。IL编译为ARM机器代码
这篇博文很好地解释了这一新默认值背后的原因:

那么,你为什么认为你的情况不同呢?因此,如果您以.NET4.0为目标,您的应用程序将在64位进程中执行(因为AnyCPU平台目标)。因此,您将看到64位版本的驱动程序

但是,如果您创建了一个以.NET 4.5为目标的新项目,您的应用程序(使用默认项目设置)将在32位进程中运行,您将看到32位版本的驱动程序


请注意,只有在创建新的.NET4.5项目时,才能看到差异;如果您只是将.NET目标版本从4.0更改为4.5,则平台目标不会从AnyCPU更改为32位首选的AnyCPU。

您好,我想知道是否可以使用此技术来判断安装的驱动程序是32位还是64位访问驱动程序?谢谢