【问题标题】:How VB6 host .net 2.0VB6 如何托管 .net 2.0
【发布时间】:2015-02-12 11:55:04
【问题描述】:

我们想从 VB6 调用一些 .net 程序集。 我知道我们可以通过 Regasm 命令将 .net 程序集注册到 COM,然后从 VB6 调用它。 但现在我们想在 VB6 中托管 CLR 2.0。

我知道我们可以调用 CorRuntimeHost 类来托管 CLR。但是 MSDN 说它已经过时了。在谷歌上搜索了几天后,我发现很多人使用 CorBindToRuntimeEx 来托管 CLR。但所有这些示例都是基于 C/C++ 的。抱歉,我没有找到任何使用 VB6 的示例。

那么有谁知道如何使用VB6 来承载.net framework 2.0。除了 CorRuntimeHost 类,还有没有其他方法可以在 VB6 中托管 .net 框架?

【问题讨论】:

  • 我希望你知道这听起来像是一个疯狂的计划。 VB6支持COM,.NET支持COM,为什么不坚持COM呢?另外,您是否还想使用更高版本的 .NET?
  • 感谢您的评论。是的,我知道这很疯狂。我们的主要目的是支持 Xcopy。我知道 com 支持多个版本,但你知道有一种叫做 Dll hell 的东西真的很痛苦,所以我们正试图找出所有可能的解决方案。由于我们的 VB 应用程序还会存在几年,所以我们正在努力寻找解决方法。
  • 您知道,如果您真的想进行现代化改造,您应该将 .NET 代码创建为 VB6 代码可以通过 COM 包装器使用的 WCF 服务。然后,您可以独立地发展每个服务,并且不需要在 VB6 中托管 .NET 所带来的维护难题。我的意思是,想想这些年来你必须向人们解释多少次。说“通过 COM 包装器使用 SOA 服务的传统 VB6 应用程序”要容易得多。

标签: c# vb.net interop clr com-interop


【解决方案1】:

CLR 主机必须是非托管的本机应用程序。使用 VB6 直接 托管 CLR 是不可能的。

实现它的唯一方法是编写一个公开 __declspec C 函数的 C++ DLL,并在 VB6 应用程序中使用这些函数。 Someone did it for FoxPro, so there is some hope.

即使假设它运行良好(我不知道两个“部分”(VB6 VM 和主机)中的 COM 层是否能很好地协同运行)你仍然必须在 C++ 中进行。 所以.. 听听约翰桑德斯的评论。不要那样做,选择另一条路。

【讨论】:

    【解决方案2】:

    我终于找到了答案。我在这里发布它是因为它可能对其他人有用。

    你可以参考excel VBA中的mscorlib.tlb,然后:

    Dim ap as ApplicationDomain, apm As mscorlib.AppDomainManager, result as object
    Set apm = New mscorlib.AppDomainManager
    Set m_domain = apm.CreateDomain("kissingerDomain", Nothing, Nothing)
    set object = m_domain.CreateInstanceFrom(DLL_Path, typeName).Unwrap
    

    现在可以调用对象方法了,哈哈。

    【讨论】:

    • 此代码不起作用:m_domain 未初始化(需要对象错误),Dim ap As ApplicationDomain 引发 User-defined type not defined 错误。你真的成功了吗?
    • 是的,它确实有效。您是否添加了 mscorlib.tlb 的引用?
    【解决方案3】:
    Private Sub LoadLib()
     Dim unknown As IUnknown
     Dim domain As AppDomain
     Dim handle As ObjectHandle
     Dim path As String
    
     On Local Error GoTo OOPS
    
     path = GetDLLPath()
    
     Set m_host = New CorRuntimeHost
     With m_host
        .Start
        .GetDefaultDomain unknown
     End With
    
     Set domain = unknown
     Set handle = domain.CreateInstanceFrom(path, "STHRest.CXlService")
     Set m_lib = handle.Unwrap
    
    OOPS:
    If Err.Number <> 0 Then
        m_err = Err.Description
        Call RemoveCLR
    End If
    
    On Local Error GoTo 0
    Exit Sub
    

    结束子

    【讨论】:

    • Private Sub LoadLib() Dim unknown As IUnknown Dim domain As AppDomain Dim handle As ObjectHandle Dim path As String On Local Error GoTo OOPS path = GetDLLPath() Set m_host = New CorRuntimeHost With m_host .Start .GetDefaultDomain未知结束设置域 = 未知设置句柄 = domain.CreateInstanceFrom(path, "STHRest.CXlService") 设置 m_lib = handle.Unwrap OOPS: If Err.Number 0 Then m_err = Err.Description Call RemoveCLR End If On Local Error GoTo 0 Exit Sub End Sub
    • 您能解释一下为什么这段代码可以帮助回答 OP 的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多