Я записал блок .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
метод. Действительно ли это нормально?
Делает у любого есть любая подсказка, что могло быть неправильным или что ступает, я отсутствовал.Спасибо!
Вы захотите поместить свою сборку .NET в GAC или запустить RegAsm с параметром командной строки / codebase (он будет жаловаться, но это, по крайней мере, сработает). К сожалению, никакой intellisense - это нормально.
Думаю, tlb-файл создается в каталоге framework, а не в этом каталоге (c: \ Program Files \ TestApp).
Может быть, в этом проблема?
В прошлый раз я увидел, что забыл жестко закодировать 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
Я заметил, что вам не нужно запускать RegAsm вручную, на самом деле просто установите для свойства AssemblyInfo ComVisible значение true:
[сборка: ComVisible (true)]
Вы также можете сделать это, перейдя в Свойства проекта -> Приложение -> Информация о сборке -> Сделать сборку COM видимой и установите флажок.
Не требуется регистрировать создаваемую вами сборку в GAC, чтобы использовать ее из VB6.