获得64& 64位.Net中的32位提供程序

时间:2014-10-29 06:08:04

标签: .net 32bit-64bit

我有一个简单的winforms实用程序,它使用以下代码检测可用的数据库提供程序:

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

这适用于为64位或32位体系结构构建64位或32位提供程序,但有什么方法可以在构建时为64位和32位提供程序64位?由于这是一个用于测试连接的实用程序,因此需要两种体系结构。

1 个答案:

答案 0 :(得分: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;
    }
}