Ссылка на .NET Assembly в VB6 не будет работать - PullRequest
9 голосов
/ 08 июня 2010

Я написал сборку .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 метод. Это нормально?

Кто-нибудь знает, что может быть не так или какие шаги я пропустил. Спасибо!

Ответы [ 5 ]

11 голосов
/ 08 июня 2010

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

4 голосов
/ 08 июня 2010

В прошлый раз я увидел, что забыл жестко кодировать 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
1 голос
/ 15 июня 2010

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

[Assembly: ComVisible (true)]

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

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

0 голосов
/ 23 октября 2010

У меня была ошибка -2147024894 или другие ошибки, независимо от того, что я пробовал, до тех пор, пока я не запустил потребительский код vb6 непосредственно из exe. Что-то в отладчике VB6, которое мешало мне использовать dll во время выполнения. Я не мог даже создать объект. Я мог ссылаться на tlb во время разработки, и у меня тоже была отличная поддержка intellisense. Как только я запустил приложение за пределами Visual Studio, все заработало отлично. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 08 июня 2010

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

Может ли это быть проблемой здесь?

...