VB6应用程序和.NET组件作为编译应用程序可以工作,但不能在VB6 IDE中工作

4
我有一个使用.Net组件(通过VB6应用程序中的.tlb引用)的VB6应用程序。当作为编译后的应用程序执行时,它运行良好,但在尝试使用.NET组件时,在VB6 IDE中会产生错误。需要注意的是,当.NET组件要调用第三方报告组件时,发生了错误。该错误与报告组件有关,可能是无法将字符串转换为其他类型。.tlb与应用程序可执行文件位于同一位置,因此不清楚为什么会出现问题。其中一个DLL有一个.config文件,但它只指定日志文件的位置。我需要在IDE中运行应用程序以便进行调试和代码步进。问题可能是什么?VB6 IDE是否会在不同的位置查找某些DLL?

1
请确保将您的"错误捕获"设置为"在未处理的错误处中断",看看是否消除了问题。此外,请确认"按需编译"始终是未选中状态。 - AMissico
错误来自第三方的.NET dll。 - CJ7
8个回答

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加载,在此过程中导致运行时不匹配)。


3
像Lucero一样,我也对配置文件感到困惑...最近我遇到了一个交互操作场景,需要为vb6可执行文件创建一个配置文件,以便让.net dll在应用程序域中正确读取设置。在那种情况下,我能够将现有的dll配置文件复制为vb6.exe.config,其中vb6是您的vb6可执行文件的名称。
如果这个想法是正确的方向,我同意Lucero的观点,即*.exe.config文件需要与IDE的原始可执行文件(我认为是vb6.exe)相关联。
虽然vb6可执行文件本身不需要.config文件才能工作,但存在.config文件会影响任何加载的.net组件,因此它可能会有所不同。
通过临时硬编码设置,您可以排除配置文件。如果在VB6 IDE中运行正常,则说明您正在朝着正确的方向前进。

3
一个强制类型转换异常并不能轻易地解释为程序默认目录的问题。这可能是你从VB6 IDE运行应用程序与直接运行时唯一不同的地方。
你需要使用调试器来查找问题所在。幸运的是,当你使用VB6时,这很容易。首先,在Visual Studio中打开你的.NET项目。选择“项目”+“属性”,然后选择“调试”选项卡。选择“启动外部程序”,点击带有点的按钮,然后导航到vb6.exe。如果你使用默认安装选项,它应该位于c:\program files\microsoft visual studio\vb98\vb6.exe。
你可以将“命令行选项”设置为.vbp项目的路径,这样IDE会自动加载它。这不是必需的。
在“调试”菜单中,勾选“Common Language Runtime Exception Thrown”复选框。按F5启动调试器。VB6 IDE现在会打开,并加载你的VB6项目(如果需要)。运行项目并重新创建失败的情况。这应该会在Visual Studio调试器中引发断点。你可能需要手动切换到它,任务栏按钮应该会闪烁。使用正常的调试工具找出为什么会抛出异常。
请注意,你也可以在Visual Studio中设置断点,这对于需要逐步执行代码找出问题的情况非常有用。当你按下F5时,断点指示器会变为空心,因为DLL尚未加载。一旦你的VB6项目从.NET代码中创建一个类对象,DLL将被加载(在输出窗口中可见),断点指示器将变为实心。如果这没有发生,那么你可能需要使用/regasm.exe选项运行Regasm.exe,以便将位于项目的bin\Debug文件夹中的DLL注册为COM服务器。

2

Mike L曾说过这句话,但是我的回答在这里描述了所有关于VB6和exe.config文件的问题,我认为这就是问题所在。


1

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


为什么IDE会查看与可执行文件不同版本的程序集? - CJ7
这不是我说的意思。我可以想象,程序集找不到是因为它没有在/codebase开关中注册。第二部分只是关于工具显示的一个警告:在许多情况下可以安全地忽略的警告。 - Stefan Egli

1
您可以尝试以下方法。这可能是一个解决方法,或者您可能能够找出实际问题所在:
  • 在Visual Studio中加载.NET dll
  • 在项目属性中,在调试选项卡上,将启动操作设置为“启动外部程序”,并将其设置为“C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE”
  • F5,现在vb6将启动
  • 在VB6调试器中加载您的VB6项目
  • 进行调试。

0

找到了几乎相似的解决方案。 我使用的是Windows 11 22H2。Visual Basic 6带有SP6和所有补丁。

首先将我的3个文件复制到c:\windows\syswow64

copy mydll.tlb c:\windows\syswow64
copy mydll.dll c:\windows\syswow64
copy mydll.pdb c:\windows\syswow64

然后注册库:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /verbose /tlb:"c:\windows\system32\mydll.tlb"

我使用了vb6.config.exe文件(复制到C:\ Program Files(x86)\ Microsoft Visual Studio \ VB98)

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

然后在C:\Program Files (x86)\Microsoft Visual Studio\VB98\中创建mklink我的.dll、.tlb和.pdb文件

mklink "C:\Program Files (x86)\Microsoft Visual Studio\VB98\mydll.pdb" "\windows\syswow64\mydll.pdb"
mklink "C:\Program Files (x86)\Microsoft Visual Studio\VB98\mydll.dll" "\windows\syswow64\mydll.dll"
mklink "C:\Program Files (x86)\Microsoft Visual Studio\VB98\mydll.tlb" "\windows\syswow64\mydll.tlb"

现在我可以在VB6 IDE中调试我的库(.net实用程序在com activex中)。

敬礼,


0

我曾经遇到过同样的问题(使用一些基于.NET的DLL通过ActiveX COM实现的VB6应用程序)。为了让它正常工作,我必须执行以下操作(可能可以跳过其中一些,但我知道每个步骤在某个时候都是必需的):

  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。

这有点像是一种散弹式的方法,但是使用上述方法,我仍然可以在Windows 8.1 64位下使用VB6 IDE并调试VB6代码(甚至通过连接Visual Studio IDE来调试.NET COM组件)。


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