2010-06-08 3 views
9

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

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

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

ответ

11

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

+0

Работал как очарование.Большое спасибо! Я запустил инструмент regasm с помощью команды/codebase./Codebase также создает для вас файл tlb. Спасибо всем за ваши ответы. – dretzlaff17

4

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

<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 
0

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

Это может быть проблема здесь?

1

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

[сборка: ComVisible (истина)]

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

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

0

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

Смежные вопросы