我已经检查了一些来源:
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
,但没有帮助。
谢谢你们。
答案 0 :(得分:4)
鉴于此处涉及的所有内容,我认为没有足够的信息可以对实际问题做出有意义的猜测。如果我遇到你的情况,我可能要做的第一件事是在Visual Studio中调试.NET组件,以查看问题是否是来自.NET组件的未处理异常:
希望你会尝试你概述的相同场景,这次它会导致异常,反过来导致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)
查看这篇文章。它针对这些类型的情况逐步进行故障排除。
答案 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个字符。)