MonoDevelop Gtk#2.0项目调用SSH.NET非静态DownloadFile报错求助
修复SSH.NET SftpClient.DownloadFile的CS0120错误及替代下载方法
一、修复CS0120错误
CS0120错误的核心原因是:你直接通过SftpClient类名调用了实例方法DownloadFile,这类方法必须通过类的实例对象才能访问,不能直接用类名调用。
具体修复步骤及代码示例
- 确保已在项目中引用SSH.NET库(MonoDevelop可通过NuGet包管理器添加)
- 创建
SftpClient实例并配置连接参数,调用实例的DownloadFile方法 - 使用
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
相关产品推荐
相关产品推荐

