对不起,我有一个特定的问题。是,这与为事件设置自定义事件处理程序有关。是的,这种类型的问题可能已经被问过很多次了,但在这里我必须限制在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()
的整个主体变为无效。
session->FileTransferred += gcnew EventHandler(FileTransferred);
EventHandler是错误的委托类型。您需要创建一个WinSCP FileTransferredEventHandler委托。修复:
session->FileTransferred += gcnew WinSCP::FileTransferredEventHandler(FileTransferred);
请注意,您还拼错了WinSCP::TransferEventsArgs,太多了。
实际上我离答案只有一步之遥。
在C#中,在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);
编译。没有抱怨。