1

Visual C# Express 2010 を使用して、マシン #1 でいくつかの C# コードを記述しています。このコードは、DLL として登録されているいくつかの COM オブジェクトに依存しています。マシン #1 で正常にコンパイルおよび実行されます。COM オブジェクトは、マシン #1 と #2 にインストールされている BostonWorkstation というプログラムからインストールされます。

  • マシン 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ビット

そのプログラム (マシン 1 でコンパイル) をマシン #2 で実行しようとすると、まったく同じ DLL が登録されていますが、プログラムの実行に失敗します。また、マシン #3 で実行しようとしましたが、これには DLL がなく、予想どおり別のエラーが発生しました。

マシン 2 の実行時エラー:

1 ボストン ワークステーションを読み込めません。エラー: System.InvalidCastException: タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプ 'BostonWorkStation70.BostonWorkStation' にキャストできません。IID '{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーにより失敗したため、この操作は失敗しました: No such interface supported (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\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 を実行してマシンのプロセス ログを比較しようとしましたが、このプログラムだけでも何千ものエントリがあり、不足している参照が直接見られることはありません。比較を実行しましたが、成功したプロセス ログには 5 倍の行があります。

私が理解していることから、マシン 2 でプログラムを実行すると、BWS オブジェクトがジェネリックSystem.__ComObject(ではなくBostonWorkStation70.BostonWorkStation) として作成され、その理由がわかりません。DLL などは間違いなくマシン 2 で正しいです。そうしないとClass not registered、実行時にそのエラーが発生します。

コンパイルされたプログラムがマシン 2 で実行されないのはなぜですか? 依存するすべての COM/DLL がその上にあります。

4

3 に答える 3

1

そのエラーメッセージがマシン#2からのものである場合は、「Visual C#2010Expressがインストールされていません」と言ったものです。

なぜデフォルトのVisualStudioプロジェクトフォルダーから実行されているのですか?

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

他の問題があるかもしれません...

于 2012-06-01T22:49:28.743 に答える
0

BostonWorkstation コンポーネントが管理されていない場合 - 依存関係ウォーカーでそれらを開いて、すべての依存 dll が存在することを確認します。

それらは管理されていないコンポーネントであり、MSVCRT 10 を利用している可能性があります。その場合、マシン 2 にVS 2010 CRTをインストールする必要があります。

于 2012-06-11T14:29:46.970 に答える
0

2 台目のマシンで regsvr32.exe を使用してライブラリから COM オブジェクト クラスを登録しましたか?

{8C8144EF-ADB7-48FD-A5BB-6E55B8382B3E}1 台目と 2 台目のマシンのレジストリを検索して、考えられるすべての文字列エントリを探します。検索結果が異なる場合は、おそらくそうです。

于 2012-06-10T21:56:03.360 に答える