通过.NET类包装的VB6 COM对象逐步执行

5
我有一个VB6对象,被一个.NET类包装。据我所记,通过运行VB6库并在所需位置插入断点,可以简单地遍历VB6对象。
然而,在我的情况下,这似乎不起作用。我尝试重新编译VB6对象,并在我的.NET项目中重新引用它,但这似乎没有帮助。
接下来该怎么办?是否有一种方式将Debugger.Launch()等效插入到VB6项目中?任何帮助都将不胜感激!
1个回答

9
robgruen 的博客 中摘录:
如果您使用互操作调用VB6 ActiveX dll或exe,并且需要调试您的VB6项目,则可能会同时打开VS.NET和VB6 IDE。 这肯定不是效率很高的做法。
通常,您将VB6项目设置为“等待组件创建”,然后启动.NET应用程序并在VB6组件中断点停止。 好吧,有一种更简单的方法可以做到这一点。 您实际上可以在VS.NET中调试您的VB6组件。 这是您需要执行的操作:
1)使用符号构建VB6项目。在VB6中打开vbp文件,并转到“项目->属性”。 选择“编译”选项卡并选中“编译为本机代码”。然后选中“无优化”单选按钮并选中“创建符号调试信息”。
这将随着.EXE一起生成.PDB(程序数据库)文件。 此文件包含调试信息,因此VS.NET调试器可以对齐源并命中断点等。(确保您的VB6 dll上具有二进制兼容性,否则您将不得不在VS.NET中删除并重新添加对VB6组件的引用。)
2)在VS.NET中打开您的.NET项目。
3)转到项目属性并选择“配置属性->调试”属性页面,并启用非托管调试。
对于VB.NET项目,此选项为“非托管代码调试”,对于C#为“启用非托管调试”。
4)选择解决方案的属性页。
5)将“调试源文件”添加到指向VB6组件源代码路径的条目中。
6)将“调试符号文件”添加到指向在步骤1中生成的.PDB文件所在文件夹的条目中。
7)现在,您应该能够在VS.NET中打开.bas、.cls、.frm等文件,并在文件中设置断点。一旦调试完成,调试器将停止在这些代码行上。

请注意,在Visual Studio 2013及更高版本中,您需要前往“调试->选项和设置”,然后勾选“使用托管兼容模式”复选框。VS2013使用了新的调试器引擎,本文所述的方法无法与其配合使用,但勾选该复选框可以使用旧的调试器模式,从而再次实现VB6代码的单步调试功能。 - Scott Chamberlain
@ScottChamberlain,我也在使用VS13。你是否需要遵循4-7步骤? - crh225
@crh225 我不太确定,我没有使用5,但是在6中,我已经将符号文件位置加载到我的“配置属性->调试->符号”设置中。至于7,我从C#转到vb6时无法让“步入”起作用,但如果我打开vb6文件并在其中设置断点,则会命中断点并停止。 - Scott Chamberlain
@ScottChamberlain 我认为这是一个需要视频帮助的时候。我按照步骤操作,但没有成功。我有一个 .net exe 引用了一个 vb6 dll。 - crh225

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