Visual Studio 6无法加载.net 2.0中编译的COM dll

时间:2010-11-18 14:58:27

标签: .net visual-studio visual-studio-2008 com interop

我在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环境开始正常工作。感谢所有回复帮助的人。

2 个答案:

答案 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代码托管代码。