65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 服务器枚举器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (17投票s)

2002年5月30日

2分钟阅读

viewsIcon

184557

downloadIcon

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() 方法。 这不是自动更新设置。

运行演示应用程序

  1. 下载源代码和演示应用程序。
  2. 将每个 zip 文件解压到同一个父文件夹。
  3. 打开源代码的解决方案并构建。
  4. 打开演示的解决方案,构建并运行。

使用 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。清理了文件夹结构。
© . All rights reserved.