我在Visual Studio 2008中针对.NET 3.5框架创建了一个强签名程序集(我也尝试了2.0框架)。我将一个类暴露为COM可见,我能够在Visual Studio 6 for Visual Basic的对象浏览器中找到这个dll。我可以在VB6中创建一个exe并直接从Windows资源管理器运行该exe,一切正常。但是,当我尝试在Visual Studio 6中运行VB6项目时,.net程序集不希望加载并因以下错误而失败:
ActiveX component can't create object
我也会收到此错误而不是上面的错误,具体取决于我如何注册dll:
-2147024894 File or assembly name (myComponentName), or one of its dependencies, was not found.
或者这个:
-2146233082 Automation error
我已经尝试了所有我能想到的东西。这似乎是VS6在调试模式下运行的方式的问题。也许环境不同,缺少这个或另一个dll的路径。我在两台不同的开发机器上遇到这个问题。我还可以引用另一个开发人员使用旧版Visual Studio .net构建的COM .net dll。我甚至用依赖walker打开了dll,我没有得到任何明显的错误。
更新 Proc监视器说VB6正在vb6 studio主目录“C:\ Program Files \ Microsoft Visual Studio \ VB98 \ MyDLL.DLL”中寻找我的dll而不是DLL注册的地方。我把dll放在那里并注册了,现在我收到了一个新的错误:
-2146234105 (80131107) "The format of the file 'MyDllName' is invalid."
那么,为什么工作室在那里寻找我的DLL而不是在哪里注册?我该如何解决这个问题?至少,如何让dll在“C:\ Program Files \ Microsoft Visual Studio \ VB98 \”文件夹中工作
最终更新/解决方案: 好的,所以我想出了问题所在。这与VB6.exe被锁定在我正在使用的.net框架版本(2.0或3.5)之间有关。我发现这个文件“C:\ Program Files \ Microsoft Visual Studio \ VB98 \ vb6.exe.config”包含以下条目:
<configuration>
<startup>
<supportedRuntime version="v1.1.4322" />
</startup>
我删除此文件后,dll从visual studio 6环境开始正常工作。感谢所有回复帮助的人。
答案 0 :(得分:2)
好的,所以我发现了问题。这与VB6.exe被锁定在我正在使用的.net框架版本(2.0或3.5)之间有关。我发现这个文件“C:\ Program Files \ Microsoft Visual Studio \ VB98 \ vb6.exe.config”包含以下条目:
<configuration>
<startup>
<supportedRuntime version="v1.1.4322" />
</startup>
我删除此文件后,dll从visual studio 6环境开始正常工作。感谢所有回复帮助的人。
答案 1 :(得分:1)
第一个错误的常见原因是在没有/ codebase命令行选项的情况下运行Regasm.exe。
第二个错误是0x8007002,Windows错误,“找不到文件”。这可能是由托管代码中的异常生成的。
第3个错误是0x80131506,“致命执行引擎错误”的托管异常代码。这是一个糟糕的,通常是由于非托管代码破坏了垃圾收集堆。
显然,您确实没有注册问题,您正在获得托管异常。但是,当你无法再通过堆栈跟踪看到漂亮的.NET异常时,它们很难诊断出来。使用调试器修复此问题。项目+属性,调试选项卡,选择“启动外部程序”并选择您的vb6程序。在要测试的代码上设置断点。它会在vb6程序调用它时立即命中。 Debug + Exception,Thrown复选框是另一种解决托管异常的好方法,调试器在throw语句处停止。虽然它可能不是你的代码,但请查看调用堆栈。
您甚至可以从VS6安装目录中选择vb6.exe。现在,您可以调试vb6代码和托管代码。