我有一个VB6程序,它试图运行用C#编写的DLL
这个DLL有一个COM接口,所以我可以使用“CreateObject”在其中创建一个类的对象。
问题是当我从VB6 IDE运行它时它运行并运行良好,但是当我创建一个EXE并尝试运行它时,它会抛出异常:
“自动化错误。系统找不到指定的文件(-2147024894)。”
为什么会这样,我该如何解决?
答案 0 :(得分:0)
查看IDE中的Project,References,查看哪个dll或ocx文件属于您使用CreateObject引用的对象(对象管理器也可能有助于查找)。 编译exe时,此dll文件也必须可用。通常,您需要在regsvr32.exe中注册它。
答案 1 :(得分: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,您应该能够使用依赖性walker工具来查看它所需的COM引用。最后确保安装了正确版本的.NET框架。
答案 2 :(得分:0)
如果要在测试计算机上编译C#DLL,请确保勾选register for COM Interop setting。如果您没有在同一台机器上进行编译,则需要使用/ codebase选项运行RegAsm。
答案 3 :(得分:0)
尝试将其编译为安装程序并包含您在编译安装程序包时使用的dll / com,以便您使用的dll / com将包含在exe ..的编译中,并将其安装在窗户不仅仅是复制过去。