2011-06-05 133 views
0

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

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

+0

什么操作系统?你正在运行IDE提升vs.作为标准用户编译的程序?你可以在这个失败的地方显示一个小程序,即一些代码,但不包含缺少重要细节的代码片段吗?请包括对象引用变量的声明,以便我们看看您是迟到还是早绑定。 – Bob77 2011-06-05 11:32:59

回答

0

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

0

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

另外尝试临时设置对变量的引用,而不是使用CreateObject使用= New,并查看它给出的错误消息(如果有的话)。通常我发现它们比CreateObject引发的更具信息性。

最后,如果您发布您选择使用CreateObject而不是设置参考的原因,将会有所帮助。如果DLL是一个已知的对象,将被程序不断使用,那么应该设置一个引用,并且通常使用早期绑定。

最后可能是错误是由C#COM DLL而不是DLL自身的依赖造成的。例如,如果我要带一个Com Library并正确注册它,但它依赖于COM Library Widget2000,并且它没有注册,那么它会抛出自动化错误。特别是如果您正在测试安装环境中的EXE,而不是您所遵守的环境。

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

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

0

如果您正在编译测试机器上的C#DLL,请确保您勾选了register for COM Interop setting。如果您不在同一台机器上编译,则需要使用/ codebase选项运行RegAsm

0

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