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。清理了文件夹结构。
