C# 服务器枚举器






4.81/5 (17投票s)
2002年5月30日
2分钟阅读

184557

3340
.NET 风格的服务器枚举器

引言
由于需要为一个项目列出服务器,Marty Cerisano 的文章 A C# Server Drop-down Control 看起来很完美。但是下载并尝试编译后,我有点沮丧。最初的代码似乎是在 Visual Studio .NET 的 BETA 版本下开发的,无法在已发布的版本下编译。(MarshalAs.LPVoid
未定义,这已在他的 2002 年 5 月 30 日发布的代码中更新)。
我决定重写代码,使其更加模块化。我将枚举服务器的代码分离到它自己的类中。我删除了指针的使用,并删除了 unsafe
块的使用。
我发现最棘手的部分是删除指针的使用。计算结构中的偏移量并使用 Marshal.PtrToStructure()
方法来获取正确的数据需要深入研究类库文档。
有三个类和一个枚举。它们是
-
ServerType
- 枚举列出可能的服务器类型,例如 SQL Server 或终端服务器。ServerType
可以进行逻辑 OR 运算,即ServerType
具有Flags
属性。 -
Servers
- 指定类型的服务器集合。实现IEnumerable
,允许使用foreach
。 -
ServerEnumerator
- 用于循环服务器列表的枚举器。 -
ServerComboBox
- 使用其他类的示例 ComboBox 控件。
注释
- 该代码不允许您获取基于 AND 连接的列表。例如,您不能要求所有也是终端服务器的 SQL Server。尝试这样做,您只会得到一个所有 SQL Server OR 终端服务器的列表。(您的 SQL Server 也可能是终端服务器)。您必须手动查询每种类型并手动执行交集操作。
AutoRefresh
属性不会自动重新扫描网络。 将AutoRefresh
设置为true
会导致对ServerType
属性的任何更改自动调用Refresh()
方法。 这不是自动更新设置。
运行演示应用程序
- 下载源代码和演示应用程序。
- 将每个 zip 文件解压到同一个父文件夹。
- 打开源代码的解决方案并构建。
- 打开演示的解决方案,构建并运行。
使用 Servers 集合
using System;
using NetworkManagement;
//
// List all the SQL Server database to the
// console (using foreach)
//
Servers servers = new Servers( ServerType.SQLServer );
foreach (String name in servers)
{
Console.WriteLine(name);
}
//
// List all the Domains to the console.
//
Servers servers = new Servers( ServerType.DomainEnum );
IEnumerator i = servers.GetEnumerator()
while ( i.MoveNext() )
{
string domainName = (string) i.Current;
Console.WriteLine(domainName);
}
使用 ServerComboBox
using System;
using NetworkManagement;
public class ServerComboBoxForm : System.Windows.Forms.Form
{
private ServerComboBox sCombo1;
private void InitializeComponent()
{
sCombo1 = new NetworkManagement.ServerComboBox();
sCombo1.AutoRefresh = true; // turn force changes on
sCombo1.ServerType = ServerType.DomainEnum;
}
// other code omitted...
}
结论
这是一个调用 Windows API 函数的简单示例。其中包括一个演示如何使用这些类的示例应用程序。
变更
2003 年 11 月 18 日
- 修复了
ServerType
枚举,使其具有 long 的 CLR 基本类型。应该可以解决 VB.NET 用户遇到的问题。 - 通过实现 Richard_D 的建议,消除了使用不安全代码的限制。现在使用 Marshal 类而不是 unsafe 块。
- 编译后的二进制文件适用于 .NET 1.1。我没有可用于编译的 .NET 1.0 系统,抱歉。
- 示例不再绑定到 SourceSafe。清理了文件夹结构。