我将保留注册表答案,因为它是可行的,但是您可以使用ConnectionOptions上的上下文来指定arch(int、32或64)
从64位访问这两个文件的示例:
static void Main(string[] args)
{
var options = new ConnectionOptions();
if (Environment.Is64BitOperatingSystem && Environment.Is64BitProcess == false)
{
Console.WriteLine("Please build as AnyCPU or x64");
return;
}
Console.WriteLine("Print 64-bit aliases");
PrintAliases(options);
Console.WriteLine("Print 32-bit aliases");
options.Context.Add("__ProviderArchitecture", 32);
PrintAliases(options);
}
private static void PrintAliases(ConnectionOptions options)
{
var scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement10", options);
try
{
scope.Connect();
}
catch
{
scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement");
}
var clientAlias = new ManagementClass(scope, new ManagementPath("SqlServerAlias"), null);
clientAlias.Get();
foreach (ManagementObject existingAlias in clientAlias.GetInstances())
{
existingAlias.Get();
var propertiesToRead = new[] { "AliasName", "ServerName", "ProtocolName", "ConnectionString" };
foreach (var propertyToRead in propertiesToRead)
{
Console.WriteLine("Property {0} = {1}", propertyToRead, existingAlias.GetPropertyValue(propertyToRead));
}
}
}
一个从32位同时访问这两个的示例(注意:当然,不管进程位是多少,都可以将arch强制为32位和64位)
class Program
{
static void Main(string[] args)
{
var options = new ConnectionOptions();
if (Environment.Is64BitProcess)
{
Console.WriteLine("Please run this sample as 32-bit");
return;
}
Console.WriteLine("Print 32-bit aliases");
PrintAliases(options);
options.Context.Add("__ProviderArchitecture", 32);
PrintAliases(options);
if (Environment.Is64BitOperatingSystem)
{
Console.WriteLine("Print 64-bit aliases");
options.Context.Add("__ProviderArchitecture", 64);
PrintAliases(options);
}
}
private static void PrintAliases(ConnectionOptions options)
{
var scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement10", options);
try
{
scope.Connect();
}
catch
{
scope = new ManagementScope(@"\\.\root\Microsoft\SqlServer\ComputerManagement");
}
var clientAlias = new ManagementClass(scope, new ManagementPath("SqlServerAlias"), null);
clientAlias.Get();
foreach (ManagementObject existingAlias in clientAlias.GetInstances())
{
existingAlias.Get();
var propertiesToRead = new[] { "AliasName", "ServerName", "ProtocolName", "ConnectionString" };
foreach (var propertyToRead in propertiesToRead)
{
Console.WriteLine("Property {0} = {1}", propertyToRead, existingAlias.GetPropertyValue(propertyToRead));
}
}
}