在VB6中引用.NET程序集无法工作

10

我用C#编写了一个.NET程序集,用于执行既可以由托管代码又可以由非托管代码使用的函数。现在,我有一个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

此外,智能感知在 obj 上不起作用。我必须手动键入 GetResponse 方法。这正常吗?

有人知道可能出了什么问题或者我错过了哪些步骤吗?谢谢!

5个回答

13
你需要将你的.NET程序集放入全局程序集缓存(GAC)中,否则请使用RegAsm命令行工具并在其中加入/codebase开关(尽管会有警告信息,但这样至少可以运行)。不幸的是,没有智能感知(Intellisense)是正常的。

运行得非常好。非常感谢!我使用 /codebase 命令运行了 regasm 工具。/codebase 命令还会为您创建 tlb 文件。感谢大家的回复。 - dretzlaff17
这是正确的方法。有时这个过程需要手动操作。因此,您可以使用安装的高级试用版本。创建一个虚拟项目并添加您的dll和tlb文件。然后,在属性中查看注册选项卡并检查注册信息。构建项目并执行exe文件。在VB6或其他IDE中关闭解决方案。然后添加引用即可。在我的情况下,VB6有效。 - lava

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

1

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

[assembly: ComVisible(true)]

您也可以通过转到项目属性 -> 应用程序 -> 程序集信息 -> 使程序集COM可见并设置复选框来完成此操作。

在从VB6中使用它时,无需将正在创建的程序集注册到GAC中。


0

我认为,tlb文件是在框架目录下生成的,而不是在这个目录下(c:\Program Files\TestApp)。

这可能是问题所在吗?


0
我一直遇到-2147024894错误,或者无论我尝试什么都会出现其他错误,直到我直接从exe运行vb6消费者代码。VB6调试器的某些东西阻止了我在运行时使用dll。我甚至无法实例化对象。我可以在设计时引用tlb,并且完美支持智能感知。一旦我在Visual Studio之外启动应用程序,一切都正常工作了。希望这能帮助到某个人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接