2014-02-06 186 views
13

上的所有訪問ACE.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(); 
} 

它返回驅動程序列表中(我們感興趣的是上註冊的OLEDB提供商訪問驅動程序),有一點需要注意..

針對.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),我們安裝了Access數據庫驅動程序(Microsoft.ACE.OLEDB.12.0)的64位版本。我們正在運行的項目被設置爲AnyCPU,我們正在使用Windows 8.1。

爲什麼枚舉不總是返回相同的結果?

如何獲得我的系統上安裝的所有提供程序的列表?我想要的原因是通常我想運行最新的驅動程序,但對於某些連接,我需要使用驅動程序的早期版本。 (這是因爲我有時需要升級舊的.mdb文件)所以如果沒有安裝舊版本,我想通知我的用戶。

其他怪事:

如果我們創建針對.NET 4.5.1控制檯應用程序,然後將其更改爲.NET 4.0和運行然後將其更改回.NET 4.0繼續返回.NET 4.0結果(Microsoft.ACE.OLEDB.12.0司機)

回答

4

你看到這裏可能是AnyCPU設置的新亞型稱爲AnyCPU 32位首選已在.NET推出的影響4.5。這個子類型是新項目的新默認值。它表示以下內容:

  • 如果進程在32位Windows系統上運行,它將作爲32位進程運行。 IL被編譯爲x86機器代碼。
  • 如果進程在64位Windows系統上運行,它將作爲32位進程運行。 IL被編譯爲x86機器代碼。
  • 如果進程在ARM Windows系統上運行,它將作爲32位進程運行。 IL被編譯爲ARM機器碼。

這背後新的默認的推理在這篇博客文章很好解釋:

What AnyCPU Really Means As Of .NET 4.5 and 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位首選