- PR -

イベント処理について(VB⇔C#)

1
投稿者投稿内容
SOLOSA
会議室デビュー日: 2008/01/11
投稿数: 16
投稿日時: 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)
--------------------------------------------------------------------------


burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2008-01-24 16:43
連載:C#入門 第13回 言語に内蔵されたイベント機能
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_013/csharp_abc01.html
SOLOSA
会議室デビュー日: 2008/01/11
投稿数: 16
投稿日時: 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);
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-25 09:10
"VB で処理する" というのはそういう意味ですか... 言語が違うということは別アセンブリからイベントを Raise したいということですね。 イベントは内部で起こるものなので、外のアセンブリから起こすべきものではないと思います。 そもそも外がタイミングを知っているなら実装する必要すらないとも言えるでしょう。

どうしても何らかの事情で必要なのであれば、'OnClientLogged' という名前のメソッドを C# 側に追加して、ここにイベントの着火コードを書きます。 VB からはこのメソッドを呼ぶようにして分断しないようにしましょう。

イベントのタイミングを外が知っているというのはやはり意味がないような...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-01-25 09:47
// や、単に C# でのハンドラ追加する記述が分からないだけと読みましたが。
// 以下はその前提での回答です。

SOLOSA さんのお書きになった C# 側コードではどこにも VB 側のイベントに絡んでません。VB 側が RaiseEvent しても絡んでないのでハンドラは呼び出されません。
ハンドラを追加する対象は当然 VB 側が定義する ClientLogin イベントです。C# が勝手に定義した ClientLoginEvent ではありません。VB 側で作った処理クラスのインスタンス.ClientLogin に += してください。

VB ではイベントハンドラの型となるデリゲート型は暗黙に定義されることがあります。Event 宣言で As 句の代わりに直接引数型を記述した場合です。この場合、そのデリゲート型はそのクラスのネストされた型として「イベント名+EventHandler」という名前で定義されますので、C# 側からデリゲートのインスタンスを生成する場合、
コード:
Class Foo
    Public Event Bar(ByVal sender As Object, ByVal e As EventArgs)
    ' 以下のデリゲートが暗黙に定義される
    ' Public Delegate Sub BarEventHandler( _
    '     ByVal sender As Object, ByVal e As EventArgs)
End Class


に対して C# では
コード:
void AddHandler() {
    Foo foo = new Foo();
    foo.Bar += new Foo.BarEventHandler(...);
}


となります。
SOLOSA
会議室デビュー日: 2008/01/11
投稿数: 16
投稿日時: 2008-01-29 14:23
有難うございました!!
正常に動作しました。
やはり、ハンドラ追加する方法が間違っていました。

ご指摘、有難うございました。
1

スキルアップ/キャリアアップ(JOB@IT)