我在使用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#的问题是否相关,但我仍然没有得到它。
答案 0 :(得分:4)
“找不到文件”不是您在此方案中预期的第一种错误。但肯定有可能,你必须注册程序集两次。一旦使用64位版本的Regasm.exe,就可以写入64位注册表项。再次使用32位版本,它将密钥写入HKLM \ Software \ Wow6432Node,其中32位客户端程序搜索密钥。
当然,这很容易被忽视,你从来没有提到这样做,所以这是一个大红旗。你通常会得到“没有注册的课程”,这种情况没有发生,可能是我们不知道的早期注册。就像Visual Studio注册它一样,你通常总是喜欢这样做,因为它可以防止注册表污染。然后,对项目或文件的简单更改可能会触发“找不到文件”。在运行32位版本的Regasm时忘记/ codebase选项是另一种方式。
最好的办法就是不要猜测。文件未找到错误很容易与SysInternals' Process Monitor相提并论。你会看到cscript.exe搜索文件而没有找到它。该文件的名称为您提供了一个非常强烈的暗示,暗示了潜在的原因。从底部向上查看迹线以避免数据中的淹没。并且先发制人地确保您使用两个版本的Regasm.exe,因为您知道这是必要的。