1

对不起,我有一个具体的问题。是的,这与为事件设置自定义事件处理程序有关。是的,这类问题可能已经被问过很多次了,但这里我只限于 WinSCP 的情况。

参考Session.SynchronizeDirectories方法中的示例:
http ://winscp.net/eng/docs/library_session_synchronizedirectories

我正在将 C# 示例转换为 C++/CLI,但遇到问题。

在 C# 中,设置为:

Session session = new Session();
session.FileTransferred += FileTransferred;
...
private static void FileTransferred(object sender, TransferEventArgs e)
{
    ....
}

在 C++/CLI 中,我执行以下操作:

WinSCP::Session ^ session = gcnew WinSCP::Session();
session->FileTransferred += gcnew EventHandler(FileTransferred);
...

static void FileTransferred(System::Object ^sender, WinSCP::TransferEventsArgs ^e)
{
    ....
}

但我得到这个错误:

函数 FileTransferred() 与委托类型“void (System::Object ^, System::EventArgs ^)”不匹配。

我尝试更改为FileTransferred(System::Object ^sender, EventArgs ^e),但随后整个身体FileTransferred()变得无效。

4

2 回答 2

2
  session->FileTransferred += gcnew EventHandler(FileTransferred);

EventHandler 是错误的委托类型。您需要改为创建 WinSCP FileTransferredEventHandler 委托。使固定:

  session->FileTransferred += gcnew WinSCP::FileTransferredEventHandler(FileTransferred);

请注意,您还拼错了 WinSCP::TransferEventsArgs,一个太多了。

于 2014-04-15T11:58:04.160 回答
0

我实际上离答案只有一步之遥。

在 C# 中,输入+=after 后session.FileTransferred,我被提示点击 Tab 按钮。然后我看到了以下内容:

session.FileTransferred += new FileTransferredEventHandler(FileTransferred);

FileTransferredEventHandler()可以获取正确的函数签名FileTransferred(object sender, TransferEventArgs e)(而不是要求FileTransferred(object sender, EventArgs e).

我回到 C++/CLI 并做同样的事情:

session->FileTransferred += gcnew FileTransferredEventHandler(FileTransferred);

编译。并且没有抱怨。

于 2014-04-16T02:35:40.903 回答