VB6 如何托管 .net 2.0

本文关键字:net 何托管 VB6 | 更新日期: 2023-09-27 18:34:12

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

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

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

VB6 如何托管 .net 2.0

我终于找到了答案。我把它贴在这里,因为也许它对其他人有用。

您可以在 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

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

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

实现此目的的唯一方法是编写一个公开__declspec C 函数的 C++ DLL,并从 VB6 应用程序中使用这些函数。有人为FoxPro做了这件事,所以有一些希望。

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

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

结束子