Joh*_*ell 2 c# com vbscript com-interop
我在使用 regasm.exe 注册的 dll 中有一个 C# COM 对象。我在 COM 对象上执行 createObject 操作,并在使用 cscript 运行的 vbs 脚本中调用该对象的方法。
如果我在命令行上运行它,它一切正常,创建对象通过 com.
cscript.exe c:\mypath\myvb.vbs argument
Run Code Online (Sandbox Code Playgroud)
我现在尝试从 C# 运行相同的命令。我使用 System.Diagnostics.Process 方法
ProcessStartInfo si = new ProcessStartInfo();
si.Filename = "cscript.exe";
si.Arguments = "c:\mypath\myvb.vbs argument";
Process exe = ProcessStart(si);
...
Run Code Online (Sandbox Code Playgroud)
当我以这种方式运行时,出现 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 位客户端程序在其中搜索密钥。
当然,这很容易被忽视,您从未提到过这样做,所以这是一个大危险信号。你通常会得到“班级未注册”,但这并没有发生,也许有一个我们不知道的更早的注册。就像 Visual Studio 注册它一样,您通常总是喜欢这样做,因为它可以防止注册表污染。对项目或文件的简单更改可能会触发“找不到文件”。另一种方法是在运行 32 位版本的 Regasm 时忘记 /codebase 选项。
最好的办法就是不要猜测这一点。使用SysInternals 的进程监视器很容易诊断文件未找到错误。您将看到 cscript.exe 正在搜索该文件但未找到它。该文件的名称可以非常强烈地提示您可能存在的根本原因。从下往上查看跟踪以避免淹没在数据中。并预先确保您使用两个版本的 Regasm.exe,因为您知道这是必要的。
| 归档时间: |
|
| 查看次数: |
1460 次 |
| 最近记录: |