Подтвердить что ты не робот

Получить список всех драйверов Access ACE.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 (reader.GetName(i) == "SOURCES_NAME") {
            list.Add(reader.GetValue(i).ToString());
         }
      }
      Console.WriteLine("{0} = {1}", reader.GetName(0), reader.GetValue(0));
   }
   reader.Close();
}

Он возвращает список драйверов (нас интересуют драйверы Access) с одной оговоркой.

Против .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)

4b9b3361

Ответ 1

То, что вы видите здесь, вероятно, является следствием нового подтипа параметра AnyCPU, называемого AnyCPU 32-битный предпочтительный, который был введен в .NET 4.5. Этот подтип является новым стандартом для новых проектов. Это означает следующее:

  • Если процесс выполняется в 32-разрядной системе Windows, он работает как 32-разрядный процесс. IL компилируется в машинный код x86.
  • Если процесс выполняется в 64-разрядной системе Windows, он работает как 32-разрядный процесс. IL компилируется в машинный код x86.
  • Если процесс выполняется в системе ARM Windows, он работает как 32-разрядный процесс. IL компилируется в машинный код ARM.

Обоснование этого нового значения по умолчанию очень хорошо объяснено в этом сообщении в блоге:

Что AnyCPU действительно имеет значение с .NET 4.5 и Visual Studio 11

Итак, почему вы видите разницу в своем случае? Поэтому, если вы нацелились на .NET 4.0, ваше приложение будет выполнено в рамках 64-битного процесса (из-за цели платформы AnyCPU). Следовательно, вы увидите 64-битную версию драйвера.

Если вы создаете новый проект, ориентированный на .NET 4.5, ваше приложение запускается (с настройками проекта по умолчанию) в рамках 32-битного процесса, и вы увидите 32-битную версию драйвера.

Обратите внимание, что вы должны увидеть разницу только в том случае, если вы создаете новый проект .NET 4.5; если вы просто измените целевую версию .NET с 4.0 до 4.5, целевой показатель платформы не изменится с AnyCPU на AnyCPU. Предпочитаемый 32-битный.