簡體   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