我在#1 机器上使用 Visual C# Express 2010 编写了一些 C# 代码。这些代码依赖于一些已注册 DLL 的 COM 对象。它在 #1 机器上编译并运行良好。COM 对象是从名为 BostonWorkstation 的程序安装的,该程序安装在 #1 和 #2 机器上。
- 机器1:
- 上写的代码。
- 已安装 Visual C# 2010 Express。
- “BWS”DLL 已注册。
- 程序运行得很好。
- 具有 .NET 版本:v4.0、v4、v3.5、v3.0、v2.0
- 32位
- 机器2:
- “BWS”DLL 已注册。
- 程序错误
System.InvalidCastException
(如下)。 - 未安装 Visual C# 2010 Express。
- 有 .NET 版本:v4、v3.5、v3.0、v2.0、v1.1
- 32位
- 机器 3:
- “BWS”DLL 未注册。
- 已安装 Visual C# 2010 Express。
- 程序错误(如预期):
System.Runtime.InteropServices.COMException (...): Retrieving the COM class factory for component with CLSID {...} failed due to the following error: 80040154 Class not registered (...)
- 32位
当我尝试在机器#2 上运行该程序(在机器 1 上编译)时,它也具有相同的注册 DLL,但程序无法运行。我还尝试在机器#3 上运行它,该机器甚至没有 DLL,并且出现了预期的不同错误。
机器 2 上的运行时错误:
1 无法加载 BostonWorkstation,错误:System.InvalidCastException:无法将“System.__ComObject”类型的 COM 对象转换为接口类型“BostonWorkStation70.BostonWorkStation”。此操作失败,因为 IID 为“{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) . 在 C:\Documents and Settings\user\My Documents\Visual Studio 2010\Projects\project1\TestBWS\CodeFile1.cs:line 67 中的 TestBWS.LoginForm()
(Visual Studio 文件夹引用只是编译时路径)
检查机器 1 上的注册表,我发现:
HKEY_CLASSES_ROOT\接口{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}
默认 REG_SZ 值为BostonWorkStation
编码:
using BostonWorkStation70; //line 1
...
try
{
bwsLogin = new BostonWorkStation(); //line 67
}
catch (Exception e)
{
Console.WriteLine("1 Unable to load BostonWorkstation, error: " + e);
System.Console.ReadLine(); //pause the debug window
return false;
}
我曾尝试运行 ProcMon 来比较机器进程日志,但仅此程序就有数千个条目,而且我没有看到任何缺失的参考资料。我进行了比较,但成功的流程日志的行数是原来的 5 倍。
据我了解,在机器 2 上运行程序使其将 BWS 对象创建为泛型System.__ComObject
(而不是BostonWorkStation70.BostonWorkStation
),我不知道为什么。DLL 等在机器 2 上绝对正确,否则我会Class not registered
在运行时收到该错误。
为什么编译后的程序不能在机器 2 上运行?所有依赖的 COM/DLL 都在上面。