You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MonoDevelop Gtk#2.0项目调用SSH.NET非静态DownloadFile报错求助

修复SSH.NET SftpClient.DownloadFile的CS0120错误及替代下载方法

一、修复CS0120错误

CS0120错误的核心原因是:你直接通过SftpClient类名调用了实例方法DownloadFile,这类方法必须通过类的实例对象才能访问,不能直接用类名调用。

具体修复步骤及代码示例

  1. 确保已在项目中引用SSH.NET库(MonoDevelop可通过NuGet包管理器添加)
  2. 创建SftpClient实例并配置连接参数,调用实例的DownloadFile方法
  3. 使用using语句管理资源,避免连接泄漏

以下是按钮点击事件的完整处理代码:

protected void OnDownloadButtonClicked(object sender, EventArgs e)
{
    // 远程服务器配置
    string host = "你的服务器IP";
    int port = 22;
    string username = "你的用户名";
    string password = "你的密码"; // 也可使用密钥认证替代密码

    // 远程文件路径与本地保存路径
    string remoteFilePath = "/remote/server/file/path.txt";
    string localFilePath = "/local/save/path.txt";

    // 使用using自动管理SftpClient资源
    using (var sftpClient = new SftpClient(host, port, username, password))
    {
        try
        {
            sftpClient.Connect(); // 建立SFTP连接

            // 打开本地文件流用于写入下载内容
            using (var localStream = new FileStream(localFilePath, FileMode.Create))
            {
                // 调用实例的DownloadFile方法,可选添加进度回调
                sftpClient.DownloadFile(remoteFilePath, localStream, (bytesTransferred) =>
                {
                    // 可在此更新Gtk进度条或打印下载进度
                    Console.WriteLine($"已传输 {bytesTransferred} 字节");
                });
            }

            sftpClient.Disconnect();
            // 弹出下载完成提示
            var successDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, "文件下载完成");
            successDialog.Run();
            successDialog.Destroy();
        }
        catch (Exception ex)
        {
            // 弹出错误提示
            var errorDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, $"下载失败:{ex.Message}");
            errorDialog.Run();
            errorDialog.Destroy();
        }
    }
}

二、MonoDevelop中的其他文件下载方法

1. SharpSSH库(SFTP协议)

SharpSSH是另一款适用于Mono环境的SSH/SFTP工具库,使用方式更简洁:

protected void OnDownloadButtonClicked(object sender, EventArgs e)
{
    string host = "你的服务器IP";
    string username = "你的用户名";
    string password = "你的密码";
    string remoteFilePath = "/remote/path/file.txt";
    string localFilePath = "/local/save/path.txt";

    var sftp = new Sftp(host, username, password);
    sftp.Connect();
    sftp.Get(remoteFilePath, localFilePath);
    sftp.Close();

    var dialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, "下载完成");
    dialog.Run();
    dialog.Destroy();
}

2. 调用系统SFTP命令行(简单场景)

如果系统已安装OpenSSH客户端,可通过Process类直接调用sftp命令:

protected void OnDownloadButtonClicked(object sender, EventArgs e)
{
    string remoteTarget = "用户名@服务器IP:/remote/path/file.txt";
    string localTarget = "/local/save/path.txt";

    var process = new Process();
    process.StartInfo.FileName = "sftp";
    process.StartInfo.Arguments = $"{remoteTarget} {localTarget}";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;

    process.Start();
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();
    process.WaitForExit();

    if (process.ExitCode == 0)
    {
        var successDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, "下载完成");
        successDialog.Run();
        successDialog.Destroy();
    }
    else
    {
        var errorDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, $"下载失败:{error}");
        errorDialog.Run();
        errorDialog.Destroy();
    }
}

3. HTTP/HTTPS文件下载(Web资源)

若需下载Web端文件,可使用WebClient或HttpClient:

protected void OnHttpDownloadButtonClicked(object sender, EventArgs e)
{
    string fileUrl = "https://example.com/target-file.txt";
    string localFilePath = "/local/save/path.txt";

    using (var webClient = new WebClient())
    {
        try
        {
            webClient.DownloadFile(fileUrl, localFilePath);
            var dialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Info, ButtonsType.Ok, "HTTP文件下载完成");
            dialog.Run();
            dialog.Destroy();
        }
        catch (Exception ex)
        {
            var errorDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, $"下载失败:{ex.Message}");
            errorDialog.Run();
            errorDialog.Destroy();
        }
    }
}

内容的提问来源于stack exchange,提问作者TseHsien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:47:49