【问题标题】:Debugging VB6 project that calls a .Net(C#) dll调试调用 .Net(C#) dll 的 VB6 项目
【发布时间】:2025-12-01 11:50:01
【问题描述】:

我已经被这个问题困扰了几个小时了。我希望有人遇到过类似的问题。

我们使用 VS2010 开发了一个原型 .Net(C#) dll,并希望能够在 C# 应用程序和 VB6 应用程序中调用此 dll。

我的问题是:

是否可以调试调用 .Net dll 的 VB6 应用程序?我收到一条错误消息“自动化错误系统找不到指定的文件

错误消息表明我的 VB6 应用程序缺少某些东西来查找 .Net dll。

我知道如果VB6应用程序已经编译,并且.exe​​已经创建,VB6在使用.exe时会成功调用.Net dll功能

然而,重要的是我们可以通过我们的 VB6 应用程序进行调试。不幸的是,调试不允许您跳过实例化 .Net DLL 的类对象的代码行。我似乎无法做到这一点。

注意:我查看了论坛和 MSDN 文档,主要是找到在 .NET 中调用 VB6 dll 的解决方案;不幸的是,这与我们需要做的相反。

注意:我已经注册了编译好的 .Net(C#) 程序集,并在 VB6 项目中引用了它。

然而,我找到了这两个页面,这似乎是我们需要的,但它是调用使用 VS2005 生成的 .NET(c#) dll 的解决方案。当使用 VS2010 生成 .NET(C#) dll 时,这似乎不起作用。

site1 site2

如果有人可以提供任何建议或指导我到可以找到的地方,那就太好了。

谢谢

解决方案 感谢@HansPassant,我找到了解决方案。 要调试包含 C# .NET 程序集的 VB6 项目,您需要通过“regasm”和“gacutil”注册 .NET dll,然后确保关闭并在开始调试之前重新打开 VB6 应用程序。

【问题讨论】:

  • 如果我正确理解您的问题,您想从 VB 6 端(即从 VB 6 IDE)进行调试吗?这是不可能的——VB 6 调试器与 VB 6 代码一起工作。它根本无法处理本机代码,当然也无法处理 MSIL (.NET) 代码,因为当 VB 6 出现时,它甚至还没有被发明出来。
  • 我猜这取决于你用来编译它的 .Net 框架。你发现的例子是相反的,因为 Visual Studio 版本试图保持向后兼容性
  • 哇好点@CodyGray。我没看出来,你是对的
  • 将 .NET 对象重新声明为“作为对象”(暂时),应该会更好。
  • @Arvo:为什么?你认为它现在被宣布为什么?为什么将其更改为 As Object 使其“工作得更好”?这将如何让您从 VB 6 进入本机/MSIL 代码?

标签: c# .net visual-studio-2010 debugging vb6


【解决方案1】:

这不是问题,VB6 使用自己的调试器,不会妨碍任何其他调试器,包括用于 C# 代码的托管调试器。

您从您的 C# 类库项目开始,确保它被选为启动项目。项目 + 属性,调试选项卡。选择“启动外部程序”选项并输入 VB6 IDE 的路径。通常是 c:\program files\microsoft visual studio\vb98\vb6.exe。在要调试的方法上设置断点。

按 F5,VB6 IDE 将开始运行。加载或创建您的 vb6 项目。请注意如何在上一步中添加 .vbp 项目的路径,以便它自动加载您的项目。

像往常一样开始调试您的 vb6 项目。一旦它开始使用您的 [ComVisible] C# 类,您的 C# 程序集就会被加载。当您的 vb6 代码调用该方法时,将触发断点。根据需要来回切换。请注意,您不能单步执行从 vb6 到 C# 代码,您必须设置断点才能让调试器停止。

【讨论】:

  • 嗨,汉斯,我刚刚尝试了您的解决方案。它与“自动化错误系统找不到指定的文件”错误注意:.net dll 包含 [COMVisible(true)] 类和方法。在与 vb6 项目相同的目录中有 C# 程序集和 .tlb 的副本。最后,.Net 程序集是使用 VS2010 编译的。是否有在 VB6 中加载 C# 程序集的特定方法?
  • 这是一个完全不同的问题,一定要问。简而言之,CLR 没有任何理由去查看 vb6 项目目录,它对此一无所知。它在 regasm.exe /codebase 目录和 GAC 中查找 [ComVisible] 程序集,在 vb98 目录和 GAC 中查找依赖程序集。使用 Fuslogvw.exe 来查看。
  • 很好,我认为这是可能的,但没有尝试过,所以我不知道它们是如何交互的,因此“不容易”:)
  • @HansPassant 嗯,既然您提到了 GAC,我可能会再试一次...我没有使用 gacutil 注册 .Net DLL,因为我在某处读到您只需要注册 .使用 regasm 的网络 dll。我是 VB6 新手(主要使用 C# 编写代码),所以请原谅我缺乏知识,目前也在研究如何使用 Fuslogvw.exe,谢谢
  • @HansPassant 另外,我已经更新了我的问题以澄清我的问题。谢谢
【解决方案2】:

啊,以可调试的方式从 VB6 使用 .NET 的奇妙之处。

  • 在 VB6 项目编译选项中(使用“生成项目”对话框窗口上的“选项”按钮到达),选择“编译为本机代码无优化创建符号调试信息选项。然后编译您的 VB6 项目。这些选项允许正确的 VB6 二进制到源映射。
  • 转到解决方案的配置属性...调试属性页并更改开始操作以启动您的 VB6 可执行文件。
  • 在 VS 解决方案资源管理器中,转到文件...添加现有项并导航到包含要调试的 VB6 源代码的文件夹。双击要调试的 VB6 源代码文件,在 VS 中应该会打开一个源窗口,允许您在 VB6 源代码中设置断点。
  • 确保您的 .NET 库具有公共默认构造函数。这是必不可少的。
  • 现在还可以设置您需要的任何 C# 断点。不要不要进入 .NET 代码 - 这不起作用。
  • 当您开始使用 VS 进行调试时,您的 VB6 和 C# 断点应该会正常命中。

【讨论】:

  • 我没有按照您的步骤打开源窗口,希望您不是说我可以在 VS2010 中打开 VB6 代码。
  • @Knoxxios,是的,您可以在 VS2010 中打开和调试 VB6 源代码。我刚才做了。双击VB6源代码文件发生了什么?
  • 源文件打开得很好(正如预期的那样,由于项目在 C# 中,它显示错误,但这不会影响 C# 项目(再次如预期))。问题是我无法通过那个 VB6 源代码进行调试:(
  • @Knoxxios,您是否按照我的第一个要点中的建议编译了您的 VB6 可执行文件?
  • 是的,我做到了;我使用您建议的设置编译它
【解决方案3】:

一种方法是单独调试每个:

  • 编译 C# DLL 并将其添加为 VB6 项目的引用后,可以在 IDE 中调试 VB6 代码。

  • 通过编译 VB6 项目并在项目属性中将其用作要运行的可执行文件,可以在 Visual Studio 中使用 VB6 主机调试 DLL。

在某些情况下,这比设置环境同时调试更简单/更快。

这种方法至少需要事先准备好每个工作的框架。

【讨论】:

  • 当您说:“在编译和引用 C# DLL 后,可以在 IDE 中自行调试 VB6 代码。”你的意思是创建可执行文件?
  • @Knoxxios 不,正在编译 DLL。要调试或测试任何一个,您都需要其他编译。因此,首先需要一个基本框架。我已经更新了我的答案以澄清。
  • 哦,在那种情况下,我已经尝试过了。我已经编译了 C# 程序集并在 VB6 项目中引用了它。我可以使用您的建议调试 C# dll,但不能调试 VB6 项目。