在VB6中引用.NET程序集不起作用

时间:2010-06-08 18:30:39

标签: c# com vb6

我使用c#编写了一个.net程序集来执行将由托管代码和非托管代码使用的函数。我有一个VB6项目,现在需要通过COM使用程序集。

我创建了.net程序集,确保将ComVisible设置为true,并通过项目属性为COM interop注册。

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 个答案:

答案 0 :(得分:11)

您希望将.NET程序集放在GAC中,或者使用/ codebase命令行开关运行RegAsm(它会抱怨,但这至少会起作用)。不幸的是,没有intellisense是正常的。

答案 1 :(得分:4)

上次我看到我忘记了对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

答案 2 :(得分:1)

我注意到你不需要手动运行RegAsm,实际上只需将AssemblyInfo属性ComVisible设置为true:

[assembly:ComVisible(true)]

您也可以转到Project properties - &gt;来执行此操作。申请 - &gt;装配信息 - &gt;使程序集COM可见,并设置复选框。

不需要将您正在创建的程序集注册到GAC中,以便从VB6中使用它。

答案 3 :(得分:0)

我认为,tlb文件是在框架目录下针对此目录生成的(c:\ Program Files \ TestApp)。

这可能是问题吗?

答案 4 :(得分:0)

我遇到了-2147024894错误或其他错误,无论我尝试了什么,直到我直接从exe运行vb6消费者代码。关于VB6调试器的一些事情,它阻止了我在运行时使用dll。我甚至无法实例化该对象。我可以在设计时参考tlb,并且也有完美的intellisense支持。一旦我在Visual Studio之外启动了应用程序,一切都运行得很好。希望这有助于某人。