2014-12-14 1 views
-1

Мы хотим назвать некоторые .net-сборки из VB6. Я знаю, что мы можем зарегистрировать сборки .net для COM командой Regasm, а затем вызвать его из VB6. Но теперь мы хотим разместить CLR 2.0 в VB6.Как хост VB6 .net 2.0

Я знаю, что мы можем назвать класс CorRuntimeHost для размещения CLR. Но MSDN заявила, что она обманчива. После нескольких дней работы в Google я обнаружил, что многие люди используют CorBindToRuntimeEx для размещения CLR. но все эти образцы основаны на C/C++. Извините, я не нашел никаких тампелей, использующих VB6.

Так кто-нибудь знает, как использовать VB6 для размещения .net framework 2.0. За исключением класса CorRuntimeHost, есть ли другой способ размещения .NET-инфраструктуры в VB6?

+1

Я надеюсь, вы знаете, что это звучит как сумасшедший план. VB6 поддерживает COM, а .NET поддерживает COM, поэтому почему бы не придерживаться COM? Кроме того, вы даже захотите использовать более позднюю версию .NET? –

+0

Спасибо за ваш комментарий. Да, я знаю, что это сумасшествие. Наша основная цель - поддержка Xcopy. Я знаю, что com поддерживает несколько версий, но вы знаете, что есть что-то под названием Dll hell, которое очень болезненно, поэтому мы пытаемся выяснить все возможные решения. Поскольку наше приложение VB все еще существует в течение нескольких лет, поэтому мы пытаемся выяснить обходное решение. –

+5

Вы знаете, что если вы действительно пытаетесь модернизировать, вы должны создать .NET-код как службы WCF, который код VB6 может использовать через COM-обертки. Затем вы можете самостоятельно развить каждую услугу и не нуждаться в головной боли обслуживания хостинга .NET внутри VB6. Я имею в виду, просто подумайте о том, сколько раз вам придется _explain_ для людей на протяжении многих лет. Гораздо проще сказать: «устаревшее приложение VB6, использующее SOA-услуги через COM-обертки». –

ответ

0
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 

End Sub

+0

Private Sub LoadLib() Dim неизвестно, как IUnknown домена Dim As AppDomain Dim ручку, как путь ObjectHandle Dim As String О местном Error GoTo OOPS путь = GetDLLPath() Set m_host = Новый CorRuntimeHost С m_host .start .GetDefaultDomain неизвестный End With Set домен = неизвестно Установить ручку = domain.CreateInstanceFrom (путь, "STHRest.CXlService") Set m_lib = handle.Unwrap OOPS: Если Err.Number <> 0 Тогда m_err = Err.Description Вызов RemoveCLR End If О местном Error GoTo 0 Exit Sub End Sub –

+1

Не могли бы вы объяснить, почему этот код может помочь ответить на OP-х вопрос? – avtomaton

0

Хост CLR должен быть неуправляемым, родным, приложением. Невозможно разместить CLR непосредственно с использованием VB6.

Единственный способ сделать это - написать C++ DLL, которая предоставляет функции __declspec C и использовать эти функции из вашего приложения VB6. Someone did it for FoxPro, so there is some hope.

Даже если предположить, что он играет хорошо (я понятия не имею, будут ли слои COM в двух «кусках» (виртуальная машина VB6 и хост) будут играть хорошо вместе), вам все равно придется делать это на C++. Итак, послушайте комментарий Джона Сондерса. Не делайте этого, выбирайте другой путь.

0

Я нашел ответ наконец. Я разместил его здесь, так как, возможно, он используется для кого-то другого.

Вы можете refere mscorlib.tlb в Excel VBA, а затем:

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 

Теперь вы можете вызвать метод объекта, ха-ха.

+0

Этот код не работает: 'm_domain' не инициализируется (ошибка, требуемая объектом), и' Dim ap As ApplicationDomain' выдает ошибку 'User-defined type not defined'. Вы действительно заставляли его работать? –

+0

Да, он действительно работает. Вы добавили ссылку mscorlib.tlb? –

0
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 
End Sub 
+0

Не могли бы вы добавить какое-то объяснение, как этот код может быть применен к вопросу OP? – avtomaton

+0

Пожалуйста, не отправляйте повторяющиеся ответы, также мы обычно предпочитаем, чтобы вы обновляли свой существующий ответ, а не публиковали новый (если только ответы не дают четких и независимых подходов.) –

+0

Извините, что я отправляю его дважды случайно. –