gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:18:54 26 4
gpt4 key购买 nike

我在使用 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 位版本,它将 key 写入 HKLM\Software\Wow6432Node,32 位客户端程序会在其中搜索 key 。

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

最好的办法就是不要猜测这个。使用 SysInternals' Process Monitor 很容易诊断文件未找到错误.您会看到 cscript.exe 正在搜索该文件,但没有找到。该文件的名称为您提供了潜在原因的强烈暗示。从下往上查看轨迹以避免淹没在数据中。并预先确保您使用两个版本的 Regasm.exe,因为您知道这是必要的。

关于c# - 为什么在从 C# 启动时从 VB 调用 C# COM 对象时出现 0x80070002 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32111000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com