首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在第一次调用后调用.NET 3.5程序集时出现VB6自动化错误

在第一次调用后调用.NET 3.5程序集时出现VB6自动化错误
EN

Stack Overflow用户
提问于 2009-09-28 14:39:15
回答 4查看 7.1K关注 0票数 0

我已经检查过的一些资源:http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_23359339.html

http://mygreenpaste.blogspot.com/2006/03/net-framework-20-configuration-tool.html

http://support.microsoft.com/kb/186063

我正忙于开发将与我们现有的VB6代码挂钩的.NET模块。我已经创建了一个测试VB6项目来启动新代码,该项目由一个带有按钮的窗体组成,该按钮的单击事件是

代码语言:javascript
复制
Dim launcher As New VB6InteropLaunchPad.launcher
launcher.FormTypeEnum = FormTypeEnum_MySpecificForm
launcher.launchAppropriateForm

当我第一次点击按钮时,它是成功的。但是,如果我再次单击该按钮,则会出现以下错误:

代码语言:javascript
复制
Run-time error '-2146233079 (80131509)': Automation Error

除非我关闭并重新启动.NET,否则对IDE代码的后续调用将失败,并显示相同的错误消息。如果我将VB6项目编译成可执行文件,同样的事情也会发生。我必须关闭可执行文件,然后再次运行它才能访问.NET代码。

我在http://support.microsoft.com/kb/186063上尝试了这个建议,并执行了以下操作:

代码语言:javascript
复制
' http://support.microsoft.com/kb/186063

Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000

Private Declare Function FormatMessage Lib "kernel32" Alias _
    "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, _
    ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
    ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) _
    As Long

Private Function MessageText(lCode As Long) As String
     Dim sRtrnCode As String
     Dim lRet As Long

     sRtrnCode = Space$(256)
     lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, lCode, 0&, _
                  sRtrnCode, 256&, 0&)
     If lRet > 0 Then
         MessageText = Left(sRtrnCode, lRet)
     Else
         MessageText = "Error not found."
     End If
End Function

On Error GoTo errHandler
   Dim launcher As New VB6InteropLaunchPad.launcher
   launcher.FormTypeEnum = FormTypeEnum_MySpecificForm
   launcher.launchAppropriateForm
   Exit Sub

errHandler:
   MsgBox MessageText(Err.Number)
   MsgBox Err

但是找不到错误。

有什么办法解决这个问题吗?我试着用set launcher = Nothing,但是没用。

谢谢你们。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-28 23:42:34

考虑到这里涉及的所有内容,我认为没有足够的信息来对实际问题做出有意义的猜测。如果我处在你的情况下,我可能会做的第一件事就是在Visual Studio中调试.NET组件,看看问题是不是来自.NET组件的未处理的异常:

  1. (可选,但通常很有用)将VB6项目配置为在编译期间生成PDB文件。打开VB6项目,然后转到项目-> MyProject属性...菜单项。选择"Compile“选项卡,然后选中"Create Symbolic Info”并编译项目项目(文件和Make MyProject.exe).
  2. Open

.NET component项目/解决方案,转到项目-> MyDotNetProject属性...)。菜单项。选择"Debug“选项卡。将“启动操作”设置为“启动外部程序”,然后浏览到通过步骤2生成的代码。选中"Enable

  1. debugging".
  2. Debug!

“(启用非托管代码启动

希望您将尝试您概述的相同场景,这一次它将导致一个异常,进而导致VS调试器在有问题的.NET代码行中断。如果您没有看到行为上的任何变化,那么转到调试->异常...菜单项(在VS中)并选中相应的复选框,以便在抛出“公共语言运行时异常”时立即中断。

票数 4
EN

Stack Overflow用户

发布于 2009-09-28 17:26:35

谷歌找到了以下来自same automation error in a similar interop situation用户的建议。

唯一有点不寻常的是我公开的类继承了一个基类。因为我不想让基类暴露给COM,所以它是用[ComVisible(false)]装饰的。当我最终从基类中删除此装饰时,COM类在VB6中工作。

因此,如果一个.NET类的基类不可见,它似乎不想将它暴露给COM。我的教训是,要公开的类不应该继承。它们应该将委托给实际执行工作的类的包含实例的类单独委托。

票数 0
EN

Stack Overflow用户

发布于 2009-09-28 21:56:41

看看这篇文章。它为这些类型的情况提供了一步一步的故障排除步骤。

http://www.vbrad.com/article.aspx?id=46

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1487406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档