繁体   English   中英

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

[英]InvalidCastException: Unable to cast COM object of type x to interface type y

我使用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位

当我尝试在还具有相同确切注册的DLL的计算机#2上运行该程序(在计算机1上编译)时,但是该程序无法运行。 我还尝试在3号机上运行它,该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 \\ Interface {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来比较机器的进程日志,但是仅此程序就有成千上万的条目,而且我看不到任何丢失的引用。 我进行了比较,但成功的Process日志的行数是原来的5倍。

据我了解,在机器2上运行程序可以将BWS对象创建为通用System.__ComObject (而不是BostonWorkStation70.BostonWorkStation ),我也不知道为什么。 DLL等绝对在机器2上是正确的,否则我将在运行时得到Class not registered错误。

为什么编译后的程序不能在计算机2上运行? 所有相关的COM / DLL都在上面。

如果该错误消息来自2号计算机,则您说“未安装Visual C#2010 Express”。

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

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

您可能还有其他问题。

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

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

如果BostonWorkstation组件不受管理,请在依赖关系查看器中打开它们,以确保存在所有其依赖的dll。

可能是它们是不受管理的组件,并使用了MSVCRT10。在这种情况下,您将需要在计算机2上安装VS 2010 CRT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM