2014-10-29 73 views
0

我有一個簡單的WinForms實用程序檢測可用的數據庫供應商使用下面的代碼:獲取64個的32位供應商在64位淨

var test = System.Data.Common.DbProviderFactories.GetFactoryClasses(); 

這種運作良好,讓無論是64位或32位提供程序是爲64位還是32位體系結構構建的,但在爲64位構建時是否有辦法同時獲得64位和32位提供程序?由於這是用於測試連接的實用程序,因此這兩種架構都是必需的。

回答

0

我用下面的代碼來獲取我的64位代碼中的32位提供程序。使用相同的方法獲取32位代碼中的64位提供程序。我不太確定這個代碼的普遍性,但它適用於我嘗試過的每臺機器。

_dtProviders = DBCore.GetAvailableProviders(); // Col 2 is Name, Col 1 is description 
List<string> providers = new List<string>(); 

string version = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion(); 

if (Environment.Is64BitProcess) 
{ 
    foreach (DataRow item in _dtProviders.Rows) 
    { 
     providers.Add(item.ItemArray[2].ToString()); 
    } 

    string fPath = "C:\\Windows\\Microsoft.NET\\Framework\\" + version + "\\Config\\machine.config"; 
    if (File.Exists(fPath)) 
    { 

     XmlDocument doc = new XmlDocument(); 
     doc.Load(fPath); 
     XmlNode node = doc.SelectSingleNode("//configuration//system.data//DbProviderFactories"); 
     foreach (XmlNode nod in node.ChildNodes) 
     { 
      var attr = nod.Attributes["invariant"].Value; 
      if (attr != null) 
      { 
       if (!providers.Contains(attr)) 
       { 
        providers.Add(attr + " (32 Bit)"); 
       } 
      } 
     } 
    } 
    else 
    { 
     textBox1.Text = "Warning: Could not locate machine config file load 32-Bit providers. No file located at '" + fPath + "'" + Environment.NewLine + Environment.NewLine; 
    } 
}