1

我在#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 都在上面。

4

3 回答 3

1

如果该错误消息来自 2 号机器,即您所说的“未安装 Visual C# 2010 Express”。

为什么它从默认的 Visual Studio 项目文件夹中运行?

C:\Documents and Settings\user\My Documents\Visual Studio 2010\Projects\project1\TestBWS\CodeFile1.cs:第 67 行

你可能还有其他问题......

于 2012-06-01T22:49:28.743 回答
0

您是否在第二台机器上使用 regsvr32.exe 从库中注册了您的 COM 对象类?

为了检查我是否会在第一台和第二台机器上搜索注册表以查找所有可能的{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}字符串条目。如果搜索结果不同,则可能是这种情况。

于 2012-06-10T21:56:03.360 回答
0

如果 BostonWorkstation 组件是非托管的 - 在依赖walker 中打开它们以确保它们的所有依赖 dll 都存在。

奇怪的是它们是非托管组件并使用 MSVCRT 10。在这种情况下,您需要在机器 2 上安装VS 2010 CRT 。

于 2012-06-11T14:29:46.970 回答