C# DLL から VB アプリにハンドラを追加する方法を知っている人がいます。VB プロジェクトで AddHandler を使用しようとすると、Visual Studio から次のように返されます。
Error BC30676 'DebugMessageEvent' is not an event of 'Debugger'...
Debugger.Instance.DebugMessageEvent は、Debugger と呼ばれる独自のクラスを持つ DLLNAMESPACE と呼ばれる DLL の一部であり、他のメソッドに関する情報を送信し、DLLNAMESPACE と呼ばれる DLL 内の他のクラスからプロセスします。
VB Proj (DLLNAMESPACE と呼ばれる DLL から自動変換) から 'DebugMessageEvent' 定義に移動すると、次のコードが得られます。
Public Class Debugger
Public DebugMessageEvent As EventHandler(Of DebugMessageArgs)
Public Shared ReadOnly Property Instance As Debugger
Public Class DebugMessageArgs
Inherits EventArgs
Public Sub New()
Public Property Message As Object
End Class
End Class
VB プロジェクト (動かない)
Imports DLLNAMESPACE
Public Class myclass
...
Private Sub backup(...)
AddHandler Debugger.Instance.DebugMessageEvent, AddressOf console_DebugMessageEvent
...
End Sub
...
Private Sub console_DebugMessageEvent(sender As Object, e As Debugger.DebugMessageArgs)
Console.WriteLine(e.Message)
End Sub
...
End Class
別の C# プロジェクト (作品)
using DLLNAMESPACE;
public partial class myclass : Form
{
...
private void backup()
{
Debugger.Instance.DebugMessageEvent += console_DebugMessageEvent;
...
}
...
void console_DebugMessageEvent(object sender, Debugger.DebugMessageArgs e)
{
Console.WriteLine(e.Message);
}
...
}
DLL C# コード
using System;
namespace DLLNAMESPACE
{
public sealed class Debugger
{
private static readonly Lazy<Debugger> instance = new Lazy<Debugger>(() => new Debugger());
private Debugger()
{
}
public static Debugger Instance
{
get { return instance.Value; }
}
public EventHandler<DebugMessageArgs> DebugMessageEvent;
public class DebugMessageArgs : EventArgs
{
public object Message { get; set; }
}
private void RaiseDebugMessageEvent(object message)
{
DebugMessageEvent?.Invoke(this, new DebugMessageArgs
{
Message = message
});
}
internal void DebugMessage(object data)
{
RaiseDebugMessageEvent(data);
}
}
}
残りのすべての DLL 関数は期待どおりに機能します。アドバイスをお願いします。DLL のコードは変更したくありません。VB.NET コードだけを変更したいのです。
いくつかの失敗したテスト
Visual Studio の検証に合格しますが、DLLNAMESPACE に関連付けられている他のバックグラウンド プロセスが閉じます。
新しい EventHandler
Imports DLLNAMESPACE
Public Class myclass
...
Private Sub backup(...)
Debugger.Instance.DebugMessageEvent = New EventHandler(Of Debugger.DebugMessageArgs)(AddressOf console_DebugMessageEvent)
...
End Sub
...
Private Sub console_DebugMessageEvent(sender As Object, e As Debugger.DebugMessageArgs)
Console.WriteLine("Consola RoboSharp: " & e.Message)
End Sub
...
End Class
ダイレクトキャスト
Imports DLLNAMESPACE
Public Class myclass
...
Private Sub backup(...)
Debugger.Instance.DebugMessageEvent = DirectCast(System.Delegate.Combine(Debugger.Instance.DebugMessageEvent, DirectCast(AddressOf console_DebugMessageEvent, EventHandler(Of Debugger.DebugMessageArgs))), EventHandler(Of Debugger.DebugMessageArgs))
...
End Sub
...
Private Sub console_DebugMessageEvent(sender As Object, e As Debugger.DebugMessageArgs)
Console.WriteLine("Consola RoboSharp: " & e.Message)
End Sub
...
End Class
誰かが私の問題を再現する時間があれば、nuget の robosharp を使用してみて、それを vb.net プロジェクトに追加してください。