有人知道如何从 C# DLL 到 VB App 的 addhandlers。当我尝试在我的 VB 项目中使用 AddHandler 时,Visual Studio 会返回:
Error BC30676 'DebugMessageEvent' is not an event of 'Debugger'...
Debugger.Instance.DebugMessageEvent 是名为 DLLNAMESPACE 的 DLL 的一部分,它具有自己的名为 Debugger 的类,并从名为 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 关联的其他后台进程关闭。
新的事件处理程序
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 项目中