我有一个VB6应用程序,它使用.Net组件(通过VB6应用程序中的.tlb引用),当作为编译应用程序执行时工作正常,但它在VB6 IDE产生错误的某个时刻正在尝试使用.NET组件。
我应该注意,当.NET组件要调用第三方报告组件时会发生错误。该错误特定于报告组件。关于无法从String转换为其他类型的东西。
.tlb与应用程序可执行文件位于同一位置,所以我不知道为什么会出现问题。其中一个DLL有.config但它只指定日志文件的位置。
我需要在IDE中运行应用程序才能调试并逐步执行代码。问题是什么? VB6 IDE是否可以在某个DLL的不同位置查找?
答案 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)
您可以尝试以下方法。它可能是一种解决方法,或者您可能能够找出实际问题:
答案 6 :(得分:0)
我遇到了同样的问题(遗留VB6应用程序利用一些基于.NET的DLL&#39; s通过ActiveX COM)。为了使这个工作,我必须做以下事情(可能会跳过以下一些,但我知道每个都需要在某一点或其他地方):
这是一种霰弹枪方法,但使用上面的方法我仍然可以在Windows 8.1 64位下使用VB6 IDE并通过附加Visual Studio IDE来调试VB6代码(甚至是.NET COM组件)。