InvalidCastException:无法将类型为x的COM对象强制转换为接口类型y

时间:2012-06-01 21:08:22

标签: c# visual-studio-2010 com visual-c#-express-2010

我使用Visual C#Express 2010在机器#1上编写了一些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上编译)时,机器#2也具有相同的注册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中的TestBWS.LoginForm():第67行

(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都在它上面。

3 个答案:

答案 0 :(得分:1)

如果该错误消息来自机器#2,那么您所说的那个" Visual C#2010 Express未安装。"

为什么它从默认的visual studio projects文件夹运行?

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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