Ссылка на блок.NET в VB6 не будет работать

Я записал блок .NET с помощью c# для выполнения функций, которые будут использоваться и управляемым и неуправляемым кодом. У меня есть проект VB6, который теперь должен использовать блок через COM.

Я создал свой блок .NET, удостоверился, что ComVisible имеет значение true и что он регистрируется для взаимодействующего с COM через свойства проекта.

public class MyClass

    [ComVisible(true)]
    public string GetResponse()
    {
        return "Testing Response"
    }

}

Я создаю блок и скопировал файл в папку. TestInterop.dll

Я затем выполняю пакетный файл для регистрации сборочного инструмента для регистрации объекта для COM.

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\
regasm "c:\Program Files\TestApp\TestInterop.dll" /tlb:TestInterop.tlb

Я открываю новое приложение VB6 и ссылочный TestInterop.dll

В VB6 я пишу следующий код, и он компилирует.

Dim obj as TestInterop.MyClass
Set obj = new TestInterop.MyClass

Dim strTest as string

strTest = obj.GetRespose()

Когда я запускаю программу это ошибки на obj. GetResponse () строка.

Run-time error' -2147024894 (80070002'):
Automation error
The system cannot find the file specified

Кроме того, intellesense не работает над obj. Я должен был ввести GetResponse метод. Действительно ли это нормально?

Делает у любого есть любая подсказка, что могло быть неправильным или что ступает, я отсутствовал.Спасибо!

9
задан shahkalpesh 8 June 2010 в 18:37
поделиться

4 ответа

Вы захотите поместить свою сборку .NET в GAC или запустить RegAsm с параметром командной строки / codebase (он будет жаловаться, но это, по крайней мере, сработает). К сожалению, никакой intellisense - это нормально.

11
ответ дан 4 December 2019 в 12:59
поделиться

Думаю, tlb-файл создается в каталоге framework, а не в этом каталоге (c: \ Program Files \ TestApp).

Может быть, в этом проблема?

0
ответ дан 4 December 2019 в 12:59
поделиться

В прошлый раз я увидел, что забыл жестко закодировать GUID. Поэтому каждый раз, когда я перекомпилировал VB, он не мог найти мой код. Это шаблон из VB.NET. (Не используйте эти GUID, создайте свои собственные.)

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "eaf83044-f0a7-417b-b333-e45aec398ca5"
    Public Const InterfaceId As String = "84e0fb8f-266d-40e6-9e8c-3d4eb37d3bf0"
    Public Const EventsId As String = "22ea2214-032f-4eb6-b2d4-c5dd213bab87"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

End Class
4
ответ дан 4 December 2019 в 12:59
поделиться

Я заметил, что вам не нужно запускать RegAsm вручную, на самом деле просто установите для свойства AssemblyInfo ComVisible значение true:

[сборка: ComVisible (true)]

Вы также можете сделать это, перейдя в Свойства проекта -> Приложение -> Информация о сборке -> Сделать сборку COM видимой и установите флажок.

Не требуется регистрировать создаваемую вами сборку в GAC, чтобы использовать ее из VB6.

1
ответ дан 4 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: