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 がその上にあります。