0

我有一个 VB6 程序,它试图运行一个用 C# 编写的 DLL。
这个 DLL 有一个 COM 接口,所以我可以使用“CreateObject”在其中创建一个类的对象。问题是当我从 VB6 IDE 运行它时它运行良好,但是当我制作 EXE 并尝试运行它时,它抛出异常:
“自动化错误。系统找不到指定的文件 (-2147024894) 。”

为什么会发生,我该如何解决?

4

4 回答 4

0

尝试将其编译为安装程序,并在安装程序包的编译中包含您使用的 dll/com,以便您使用的 dll/com 将包含在您的 exe 的编译中。只是复制过去。

于 2011-06-23T04:04:29.320 回答
0

如果你在你的测试机器上编译 C# DLL - 确保你已经勾选了COM Interop 设置的寄存器。如果您不在同一台机器上编译,则需要使用 /codebase 选项运行RegAsm 。

于 2011-06-08T15:01:34.563 回答
0

查看 IDE 中的 Project、References 并查看哪个 dll 或 ocx 文件属于您使用 CreateObject 引用的对象(对象管理器也可能有助于找出)。该 dll 文件也必须在编译 exe 时可用。通常,您需要将其注册到 regsvr32.exe。

于 2011-06-05T09:21:51.673 回答
0

我用来解决此类问题的一种技术是在 Visual Basic 6 中打开添加引用对话框。我滚动可用 COM 库列表并查看是否列出了问题 DLL。如果是,那么 CreateObject 应该可以工作,您应该能够为其分配一个变体变体并使用后期绑定来访问它的成员。

另外尝试临时设置对变量的引用,而不是使用 CreateObject 使用 = New 并查看它给您的错误消息(如果有)。一般来说,我发现它们比 CreateObject 抛出的信息更丰富。

最后,如果您发布选择使用 CreateObject 而不是设置参考的原因,这将有所帮助。如果 DLL 是程序将持续使用的已知对象,则应设置引用并通常使用早期绑定。

最后,错误可能是由于 C# COM DLL 的依赖而不是 DLL 本身引起的。例如,如果我要获取一个 Com 库并正确注册它,但它依赖于 COM 库 Widget2000 并且它没有注册,那么它将引发自动化错误。特别是如果您在它的安装环境中测试 EXE,而不是在您编译它的环境中。

例如,假设我有一个用 VB6 编写的 CAD 程序,并且我有一个以 MyCAD 开头的源代码树。exe 在 MyCAD/MainEXE 中,形状库在 MyCAD/ShapeLibrary 中。我运行IDE一切都很好。然后我进行设置并转到我的测试机器并安装它,它在创建 shapelibrary 时出错。

我要做的第一件事是检查 MainEXE 是否会直接从源代码树的 MainEXE 目录中运行。该测试将消除它是安装问题还是 IDE 与已编译版本的怪癖。然后我会查看设置并查看未注册的内容。还要查看 C# 库的源代码或库的设置,看看它需要哪些依赖项。由于它是一个编译好的 COM DLL,您应该能够使用依赖遍历器工具来查看它需要哪些 COM 引用。最后确保安装了正确版本的 .NET 框架。

于 2011-06-06T12:31:00.123 回答