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

时间:2009-09-28 14:39:15

标签: .net vb6 interop automation

我已经检查了一些来源: 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项目,从该项目中启动新代码,该代码包含带按钮的表单,并且按钮的单击事件是

Dim launcher As New VB6InteropLaunchPad.launcher
launcher.FormTypeEnum = FormTypeEnum_MySpecificForm
launcher.launchAppropriateForm

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

Run-time error '-2146233079 (80131509)': Automation Error

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

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

' 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,但没有帮助。

谢谢你们。

4 个答案:

答案 0 :(得分:4)

鉴于此处涉及的所有内容,我认为没有足够的信息可以对实际问题做出有意义的猜测。如果我遇到你的情况,我可能要做的第一件事是在Visual Studio中调试.NET组件,以查看问题是否是来自.NET组件的未处理异常:

  1. (可选,但通常很有帮助)配置VB6项目以在编译期间生成PDB文件。打开VB6项目并转到项目 - > MyProject Properties ...菜单项。选择“编译”选项卡,然后选中“创建符号调试信息”
  2. 编译VB6项目(文件 - >生成MyProject.exe)。
  3. 打开.NET组件项目/解决方案,转到项目 - > MyDotNetProject属性...菜单项。选择“调试”选项卡。将“Start Action”设置为“Start External Program”并浏览到通过步骤2生成的.exe。
  4. (可选,但通常很有帮助)选中“启用非托管代码调试”。
  5. 调试!
  6. 希望你会尝试你概述的相同场景,这次它会导致异常,反过来导致VS调试器在违规的.NET代码行上中断。如果您没有看到任何行为更改,那么转到Debug - >可能会有所帮助。异常...菜单项(在VS中)并选中相应的复选框,以便在抛出“公共语言运行时异常”时立即中断。

答案 1 :(得分:0)

Google向same automation error in a similar interop situation的某个人提出了以下建议。

  

在   只是有点不寻常的事情   我的暴露类继承自   基类。因为我不想要   暴露给COM的基类是   用[ComVisible(false)]装饰。   当我终于删除这个装饰   从基类COM类   在VB6工作。

     

所以似乎mscorlib不想   如果是.NET,则将.NET类暴露给COM   基类不可见。我的教训   是那些类   暴露不应该继承。他们   应该委托的单个类   包含该类的实例   真的做了。

答案 2 :(得分:0)

查看这篇文章。它针对这些类型的情况逐步进行故障排除。

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

答案 3 :(得分:0)

谢谢普拉特先生!我通过逐步执行.NET代码完成了你的建议,并发现我必须在我的.NET代码启动的地方添加一个try / catch(这个名称非常幽默但名称很简单的“VB6LaunchPad”项目):

Application.EnableVisualStyles();
try
{
   Application.SetCompatibleTextRenderingDefault(false);
}
catch (InvalidOperationException)
{
   // Do Nothing
}
// Some DevExpress init code
SkinManager.EnableFormSkins();
LookAndFeelHelper.ForceDefaultLookAndFeelChanged();

Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);是否必要?

(很抱歉没有将此作为评论发布,超过600个字符。)