【问题标题】:Interop Error 430 Class Does Not Support Automation互操作错误 430 类不支持自动化
【发布时间】:2013-11-20 05:10:55
【问题描述】:

我有一个已为 Interop 注册的 VB.NET 程序集。我在我的 VB6 项目中使用这个程序集中的一个类。

在现有的 VB6 项目中,我添加了对类型库的引用并运行以下代码:

Dim vizDataSingleton As Vizual_Data.Singleton
Set vizDataSingleton = New Vizual_Data.Singleton

第二行错误“运行时错误430:类不支持自动化或不支持预期接口”

但是,如果我启动一个空白的 VB6 项目并添加引用,完全相同的代码可以正常工作。

我检查了 vbp 文件中对 tlb 的引用,它们都是相同的。

Reference=*\G{BDB20DDF-D3B7-4484-8950-35D67DED45EC}#4.2#0#..\Vizual.Data\Vizual.Data\bin\Debug\Vizual.Data.tlb#VMS Data Structure Library

我也尝试过使用后期绑定:

Set vizDataSingleton = CreateObject("Vizual.Data.Singleton")

在现有项目中出现此错误,“类型不匹配”,但在新项目中仍然有效

任何想法为什么这在一个项目中失败但在另一个项目中有效?

【问题讨论】:

  • 你是否在你的类上正确地暴露了一个显式的ComInterfaceType.InterfaceIsIDispatch 接口(或者至少是一个ClassInterfaceType.AutoDispatch 类接口)? msdn.microsoft.com/en-us/library/…
  • 显然您正在寻找一个古怪的解释。后期绑定时看到“类型不匹配”肯定很奇怪。 .NET 异常是一种解释,让 VB6 代码在非 STA 线程上运行是另一种解释。请务必使用托管调试器来解决此问题,将 VB6.exe 设置为启动程序。添加一些调试代码,以便您可以检查 Thread.CurrentThread.GetApartmentState() 的值
  • @Noseratio - 类被声明为 <ClassInterface(ClassInterfaceType.AutoDual)>,COM Guids ClassIdInterfaceIdEventsId 在类内声明为 Const
  • @HansPassant - 如果我从 VS2012 开始并指定在启动时运行 VB6.exe,当我打开同一个项目时它不会失败(早期或后期绑定)
  • 无赖。好吧,继续寻找一个古怪的解释。接下来使用 SysInterals 的 ProcMon 并进行比较。

标签: vb.net com vb6 com-interop typelib


【解决方案1】:

我最终找到了这个错误的原因。

我有另一个依赖于原始 .NET 程序集 (Vizual_Data) 的 .NET 互操作程序集 (Vizual_Lib)。

在失败的 VB6 应用程序中,它引用了这两个,但我的新应用程序只引用了 Vizual_Data。重新编译Vizual_Lib 解决了这个问题。

这是一个奇怪的错误,当使用 Vizual_Data 类而不是其他 Vizual_Lib 类时发生故障。

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多