从C#启动时,为什么从VB调用C#COM对象时出现0x80070002错误?

从C#启动时,为什么从VB调用C#COM对象时出现0x80070002错误?,c#,vbscript,com,com-interop,C#,Vbscript,Com,Com Interop,我在使用regasm.exe注册的dll中有一个C#COM对象。 我对COM对象执行createObject,并在使用cscript运行的vbs脚本中对该对象调用方法 如果我在命令行上运行它,它会正常工作,创建对象并通过com调用该方法 cscript.exe c:\mypath\myvb.vbs argument 我现在正试图从C#运行相同的命令。我使用System.Diagnostics.Process方法 ProcessStartInfo si = new ProcessStartInf

我在使用regasm.exe注册的dll中有一个C#COM对象。 我对COM对象执行createObject,并在使用cscript运行的vbs脚本中对该对象调用方法

如果我在命令行上运行它,它会正常工作,创建对象并通过com调用该方法

cscript.exe c:\mypath\myvb.vbs argument
我现在正试图从C#运行相同的命令。我使用System.Diagnostics.Process方法

ProcessStartInfo si = new ProcessStartInfo();
si.Filename = "cscript.exe";
si.Arguments = "c:\mypath\myvb.vbs argument";
Process exe = ProcessStart(si);
...
当我以这种方式运行时,会出现0x80070002错误,这基本上是一个文件未找到错误。我不明白为什么它不同于C#到命令行

编辑-更多信息

我运行的是64位操作系统。C#COM dll是用“AnyCPU”构建的。 我用的是64位的regasm。 我使用的cscript来自c:\windows\system32,因此它是64位版本

从命令行中,如果我故意使用32位版本的cscript,我也会得到0x80070002错误。这让我怀疑c#的问题是相关的,但我仍然不明白。

在这种情况下,“未找到文件”并不是您所期望的第一种错误。但这当然是有可能的,你必须注册大会两次。一旦使用64位版本的Regasm.exe,就可以写入64位注册表项。同样,对于32位版本,它会将密钥写入HKLM\Software\Wow6432Node,其中32位客户端程序会搜索密钥

这很容易被忽视,当然,你从来没有提到过这样做,所以这是一个巨大的危险信号。你通常会得到“班级未注册”,但这并没有发生,也许有一个我们不知道的早期注册。就像VisualStudio注册它一样,您通常会喜欢这样做,因为这样可以防止注册表污染。对项目或文件的简单更改会触发“找不到文件”。另一种方法是在运行32位版本的Regasm时忘记/codebase选项

最好的办法就是不要猜这个。文件未找到错误很容易诊断。您将看到cscript.exe正在搜索该文件,但没有找到它。文件名为您提供了一个非常强烈的提示,即潜在的原因可能是什么。自下而上查看跟踪,以避免淹没在数据中。并预先确保使用两个版本的Regasm.exe,因为您知道这是必要的。

在这种情况下,“找不到文件”不是您预期的第一种错误。但这当然是有可能的,你必须注册大会两次。一旦使用64位版本的Regasm.exe,就可以写入64位注册表项。同样,对于32位版本,它会将密钥写入HKLM\Software\Wow6432Node,其中32位客户端程序会搜索密钥

这很容易被忽视,当然,你从来没有提到过这样做,所以这是一个巨大的危险信号。你通常会得到“班级未注册”,但这并没有发生,也许有一个我们不知道的早期注册。就像VisualStudio注册它一样,您通常会喜欢这样做,因为这样可以防止注册表污染。对项目或文件的简单更改会触发“找不到文件”。另一种方法是在运行32位版本的Regasm时忘记/codebase选项


最好的办法就是不要猜这个。文件未找到错误很容易诊断。您将看到cscript.exe正在搜索该文件,但没有找到它。文件名为您提供了一个非常强烈的提示,即潜在的原因可能是什么。自下而上查看跟踪,以避免淹没在数据中。并预先确保您同时使用两个版本的Regasm.exe,因为您知道这是必要的。

谢谢您的帮助。我还喜欢您使用SysInternals Process Monitor的观点,它帮助我解决了我遇到的另一个错误。我还喜欢您使用SysInternals Process Monitor的观点,它帮助我解决了我遇到的另一个错误。