从 C# 中的其他方法访问创建的对象

accessing created objects from other methods in c#

我正在编写一个 c# SSH 隧道程序来将动态隧道整合到一个程序中,而不是使用 putty+firefox socks4/chrome socks4 插件,输入相同的 user/pass..ect。它正在使用 Renci.SSHNet 库。

我的问题是:当我创建一个新的 SshClient 对象时,我希望能够稍后通过终止连接按钮终止该连接,并且还能够 运行 一个单独的线程,说 while (isConnected) if (!addedToList) addtolist..问题是我不确定如何同时访问不同的 运行ning sshClient 对象。假设我有 3 个与不同主机的开放连接。如果我 select 来自当前连接的主机 ip,我需要一种方法将该 ip 地址与 SshCLient 连接连接,然后 运行 sshClient.Disconnect()。我意识到您可以使用 sshClient.ConnectionInfo.Host.ToString() 并将字符串与之匹配,但是如果我使用不同的方法(单击终止连接按钮),我又不知道如何将 192.168.1.1 的主机 IP 匹配到连接到该主机的 sshClient。

我研究了弱引用,但这似乎只有在我只有一个 sshClient 时才有效。如果有一种方法可以访问当前创建的 SshClient 对象,然后将其与主机 ip 属性 匹配,它就会起作用。我在 Google.

中找不到这个

我想过设计一些复杂的方法来创建以 deviceIpString 命名的私有对象变量 SshClients,但不确定如何创建以另一个变量的内容 (String) 命名的变量。 如:

deviceIpString = 192.168.1.1;
(i am pretending that backticks access the variable's data, since I dont know how to do it)
private SshClient 'deviceIpString' = new (SshClient(arguments));

编辑:我用在我编写的另一个程序中使用的简洁解决方案解决了这个问题。我更改了问题的名称,因为这可以应用于任何类型的任何对象,只要您可以制作它们的数组即可。 (不确定你不能的情况,也许一个程序只允许该类型的一个对象)

解决方案:创建一个私有数组来存储您以后要引用的所有对象。将其设置为您认为有可能在程序中创建的多个对象。然后,为索引创建一个私有 int 变量,从 0 开始。创建一个接受对象作为参数的私有 void(或 public,如果需要)方法。结果应如下所示:

private SshClient[] sshClients = new SshClient[10];
private int sshClientIndex = 0;
private void registerSshClient(SshClient sshClient)
{
  sshClients[sshClientIndex] = sshClient;
  ++sshClientIndex;
}

然后,当你到达创建对象的位置时,在必要时使用 register 方法将其添加到数组中。我在确认 sshClient 已连接后执行此操作。然后,当您需要对您注册的特定对象执行某些操作时,找到可以用来匹配它的某种类型的数据。 sshClient 连接后,我的程序将主机 ip 添加到列表框。我使用这个 ip 地址来匹配 sshClient 的连接信息 属性。要匹配数组中的某个对象,请使用 for 循环。这是我的“终止连接”按钮的示例:

private void button_kill_connection_Click(object sender, EventArgs e)
    {
        Object selectedConnection = null;
        selectedConnection = lbox_current_connections.SelectedItem;
        String selectedConnectionString = selectedConnection.ToString();
        for (int i = 0; i <= --sshClientIndex; i++)
        {

            if (sshClients[i].ConnectionInfo.Host == selectedConnectionString)
            {
                sshClients[i].Disconnect();
                lbox_current_connections.Items.Remove(selectedConnection);
            }
        }
    }

for 循环从第一个数组元素 (0) 开始,直到达到注册的连接数(实际存储的对象)为止。