- - PR -
イベント処理について(VB⇔C#)
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-01-24 16:35
基本的な事だと思いますが、よく理解できないので教えて下さい。
VB.NETで作成したDLLファイルをC#.NETで参照したプロジェクトです。 以下の状況で、C#側でイベントハンドラ処理を施したいのですが、どのような処理が必要になるのでしょうか?VBで処理する場合は、以下のハンドラ処理で問題なく動いています。C#の場合、これに変わる処理はどうすれば良いのでしょうか?教えて下さい。 ・Dim WithEvents cServer As Server ・Private Sub cServer_ClientLogin(ByVal sender As UserConnection, ByRef TFTPClient As Server.Client) Handles cServer.ClientLogin ---[状況]-------------------------------------------------------------------- VB側(DLL):TcpListenerを使用してクライアントからの接続待ちをしている処理。 ↑(参照) C#側:クライアント接続あった際に、UI(Listbox)に接続ログを表示する。 (VB側)のイベント処理 ・Public Event ClientLogin(ByVal sender As UserConnection, ByRef TFTPClient As Client) ・RaiseEvent ClientLogin(sender, aSTRUCT) -------------------------------------------------------------------------- | ||||||||
|
投稿日時: 2008-01-24 16:43
連載:C#入門 第13回 言語に内蔵されたイベント機能
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_013/csharp_abc01.html | ||||||||
|
投稿日時: 2008-01-24 20:40
burton999様、参考となる情報提供いただき、有難うございます。
情報を元に、色々試して以下のコードでいけるはずと思っていたのですが、 できません。 以下のどこに問題があるのでしょうか?コンパイルは問題ありません。 [VB側] "RaiseEvent ClientLogin(sender, aSTRUCT)"から、どうしても[C#側]のイベントハンドラ処理に飛んでくれません。 以下が、[C#側]のイベント処理です。 デリゲート設定 ・public delegate void ClientLoginEventHandler(UserConnection sender, out Server.Client e); イベント設定 ・public event ClientLoginEventHandler ClientLoginEvent; ハンドラ追加 ・ClientLoginEvent += new ClientLoginEventHandler(cServer_ClientLogin); | ||||||||
|
投稿日時: 2008-01-25 09:10
"VB で処理する" というのはそういう意味ですか... 言語が違うということは別アセンブリからイベントを Raise したいということですね。 イベントは内部で起こるものなので、外のアセンブリから起こすべきものではないと思います。 そもそも外がタイミングを知っているなら実装する必要すらないとも言えるでしょう。
どうしても何らかの事情で必要なのであれば、'OnClientLogged' という名前のメソッドを C# 側に追加して、ここにイベントの着火コードを書きます。 VB からはこのメソッドを呼ぶようにして分断しないようにしましょう。 イベントのタイミングを外が知っているというのはやはり意味がないような... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2008-01-25 09:47
// や、単に C# でのハンドラ追加する記述が分からないだけと読みましたが。
// 以下はその前提での回答です。 SOLOSA さんのお書きになった C# 側コードではどこにも VB 側のイベントに絡んでません。VB 側が RaiseEvent しても絡んでないのでハンドラは呼び出されません。 ハンドラを追加する対象は当然 VB 側が定義する ClientLogin イベントです。C# が勝手に定義した ClientLoginEvent ではありません。VB 側で作った処理クラスのインスタンス.ClientLogin に += してください。 VB ではイベントハンドラの型となるデリゲート型は暗黙に定義されることがあります。Event 宣言で As 句の代わりに直接引数型を記述した場合です。この場合、そのデリゲート型はそのクラスのネストされた型として「イベント名+EventHandler」という名前で定義されますので、C# 側からデリゲートのインスタンスを生成する場合、
に対して C# では
となります。 | ||||||||
|
投稿日時: 2008-01-29 14:23
有難うございました!!
正常に動作しました。 やはり、ハンドラ追加する方法が間違っていました。 ご指摘、有難うございました。 |
1