VB6 App + .Net组件作为编译应用程序工作,但不在VB6 IDE中

时间:2010-05-18 07:09:07

标签: .net vb6 interop

我有一个VB6应用程序,它使用.Net组件(通过VB6应用程序中的.tlb引用),当作为编译应用程序执行时工作正常,但它在VB6 IDE产生错误的某个时刻正在尝试使用.NET组件。

我应该注意,当.NET组件要调用第三方报告组件时会发生错误。该错误特定于报告组件。关于无法从String转换为其他类型的东西。

.tlb与应用程序可执行文件位于同一位置,所以我不知道为什么会出现问题。其中一个DLL有.config但它只指定日志文件的位置。

我需要在IDE中运行应用程序才能调试并逐步执行代码。问题是什么? VB6 IDE是否可以在某个DLL的不同位置查找?

7 个答案:

答案 0 :(得分:4)

这可能是由于运行时版本不匹配造成的。请尝试以下方法:

为IDE创建.config文件(例如IDE可执行文件的EXE名称+ .config)。

将以下内容粘贴到其中:

<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
    <requiredRuntime version="v2.0.50727" safemode="true"/>
  </startup>
</configuration>

这将确保加载.NET 2运行时,无论.NET COM组件的激活顺序是什么(其中一些可能由IDE加载,导致进程中的运行时不匹配)。

答案 1 :(得分:3)

和Lucero一样,我想知道配置文件...我最近有一个互操作方案,我必须为vb6可执行文件创建一个配置文件,以便让.net dll在appdomain中正确读取设置.net库运行的。在这种情况下,我能够获取dll的现有配置并将其复制为 vb6 .exe.config,其中 vb6 是您的vb6可执行文件的名称。

如果这个想法是正确的方向,我同意Lucero你的* .exe.config文件需要与IDE的原始可执行文件相关联......我相信它是vb6.exe。< / p>

虽然vb6可执行文件本身不需要.config文件,但是配置文件的存在会影响任何加载的.net组件,因此它可能会产生影响。

您可以通过临时硬编码设置来排除配置文件。如果它在VB6 IDE中有效,那么您就知道自己正朝着正确的方向发展。

答案 2 :(得分:3)

程序的默认目录存在问题,不能轻易解释转换异常。当您从VB6 IDE而不是直接运行应用程序时,应该有所不同。

你必须使用调试器来找出问题所在。幸运的是,当你使用VB6时这很容易。首先在Visual Studio中打开.NET项目。 Project + Properties,Debug选项卡。选择“启动外部程序”,单击带有点的按钮并导航到vb6.exe。如果您使用默认安装选项,它应位于c:\ program files \ microsoft visual studio \ vb98 \ vb6.exe中。

您可以将“命令行选项”设置为.vbp项目的路径,以便IDE自动加载它。不是绝对必要的。

Debug + Exceptions,选中“Common Language Runtime Exception”Thrown复选框。按F5启动调试器。 VB6 IDE现在将打开,必要时加载VB6项目。运行项目并重新创建失败案例。这应该会导致Visual Studio调试器中的断点。您可能需要手动切换到它,任务栏按钮应该闪烁。使用常规调试工具找出抛出异常的原因。

请注意,您还可以在Visual Studio中设置断点,如果您需要单步执行代码以找出错误,则非常有用。当您按F5时,断点指示器变为空心,因为尚未加载DLL。只要您的VB6项目从.NET代码创建一个类对象,DLL就会被加载(在“输出”窗口中可见),断点指示器将变为实线。如果没有发生这种情况,那么您可能需要使用/ codebase选项运行Regasm.exe,以便项目的bin \ Debug文件夹中的DLL被注册为COM服务器。

答案 3 :(得分:2)

Mike L已经说过了,但我的回答here描述了有关VB6和exe.config文件的所有问题,我相信这就是问题所在。

答案 4 :(得分:1)

我会尝试使用带有/ codebase开关的regasm注册.net组件。如果程序集不在GAC中,该工具将向您发出警告,但除非您在同一台计算机上有多个不同版本的程序集,否则您可以忽略该警告。

答案 5 :(得分:1)

您可以尝试以下方法。它可能是一种解决方法,或者您可能能够找出实际问题:

  • 在Visual Studio中加载.NET dll
  • 在项目属性中的Debug选项卡上,将Start操作设置为“Start external program”并将其设置为“C:\ Program Files \ Microsoft Visual Studio \ VB98 \ VB6.EXE”
  • F5,现在vb6将开始
  • 在VB6调试器中加载VB6项目
  • 调试。

答案 6 :(得分:0)

我遇到了同样的问题(遗留VB6应用程序利用一些基于.NET的DLL&#39; s通过ActiveX COM)。为了使这个工作,我必须做以下事情(可能会跳过以下一些,但我知道每个都需要在某一点或其他地方):

  1. 将DLL和TLB文件复制到VB6 IDE EXE所在的文件夹(例如C:\ Program Files(x86)\ Microsoft Visual Studio \ VB98)。凌乱而烦人,但我还没有找到替代方案。
  2. 添加合适的VB6.exe.config文件(如上所述)。
  3. 您可能还需要DLL自身的.config文件(例如,如果.NET DLL名为abc.dll,则配置文件将为abc.dll.config)。似乎有些东西会从VB6配置文件和DLL配置文件中的其他内容中读取。它可能可以解决从何处来的问题,但最简单的方法就是使两个配置文件保持一致。
  4. 确保已应用VB6 SP6。
  5. 以管理员身份运行VB6 IDE。
  6. 在XP SP3兼容模式下运行VB6 IDE。
  7. 这是一种霰弹枪方法,但使用上面的方法我仍然可以在Windows 8.1 64位下使用VB6 IDE并通过附加Visual Studio IDE来调试VB6代码(甚至是.NET COM组件)。