c# - 通过互操作将 VB6 对象传递给 .NET 对象?

标签 c# .net vb6 com-interop

我有一个 VB6 应用程序,它通过互操作显示 .NET DLL 表单。

我希望 .NET DLL 中的事件能够导致显示 VB6 应用程序中的表单。

我的想法是让 VB6 应用程序将对表单的引用传递给 .NET DLL。例如:

[VB6]
Dim objNetDllObject As New NetDllObject
objNetDllObject.PassVb6Form(MyForm)
objNetDllObject.ShowForm

[C#]
object Vb6Form; 
private void PassVb6Form(object form) { Vb6Form = form; }
private void button1_Click(object sender, EventArgs e) { Vb6Form.Show(); }

这行得通吗?

我在别处读到,跨“进程边界”发送对象会导致问题。这是正确的吗?

最佳答案

一种方法是在 .NET 中定义 COM 接口(interface):

<System.Runtime.InteropServices.GuidAttribute("0896D946-8A8B-4E7D-9D0D-BB29A52B5D08"), _
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IEventHandler
    Sub OnEvent(ByRef sender As Object, ByRef e As Object)
End Interface

在VB6中实现这个接口(interface)

Implements MyInterop.IEventHandler

Private Sub IEventHandler_OnEvent(ByRef sender As Variant, ByRef e As Variant)
    Dim id
    id = e.Entity.Id
    ' As long as e is COM Visible (not necessarily COM registered, this will work)
End Sub

然后在 .NET 中有一个带有 IEventHandler 静态集合的注册器:

<ComClass(ComRegistrar.ClassId, ComRegistrar.InterfaceId, ComRegistrar.EventsId>
Public Class ComRegistrar

   Private Shared ReadOnly _eventHandlers As New Dictionary(Of String, List(Of IEventHandler))


   ' This is called by .NET code to fire events to VB6
   Public Shared Sub FireEvent(ByVal eventName As String, ByVal sender As Object, ByVal e As Object)
        For Each eventHandler In _eventHandlers(eventName)
                eventHandler.OnEvent(sender, e)
        Next
   End Sub

   Public Sub RegisterHandler(ByVal eventName As String, ByVal handler As IEventHandler)
        Dim handlers as List(Of IEventHandler)
        If Not _eventHandlers.TryGetValue(eventName, handlers)
             handlers = New List(Of IEventHandler)
             _eventHandlers(eventName) = handlers
        End If
        handlers.Add(handler)
   End Sub

End Class

您的 .NET 代码将调用 FireEvent,如果 VB6 之前调用了 RegisterHandler,则将调用您的 VB6 IEventHandler。

关于c# - 通过互操作将 VB6 对象传递给 .NET 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563083/

相关文章:

c# - 使用 jQuery 将值传递给代码隐藏

c# - 异步函数内部的普通方法也应该是异步的吗?

c++ - 在 VB6 中使用 C++ DLL

c# - 更新用户界面的后台计时器?

c# - 错误 : your connection to this site is not private Asp. 网络。 MVC5

c# - 根据日期时间比较两个文件最多一分钟?

c# - .Net 应用程序设置 - 属性绑定(bind) OnPropertyChanged()

.net downloadstring(url) 突然返回503错误

VB6 对象比较

vb6 - 将 8 字节数组转换为 Double