コンポーネントサービスを使用してMSIにエクスポートされ、テストサーバーにインストールされたCOM+アプリケーションがあります。Webアプリケーション(ASP)は、COM+アプリケーションから使用するオブジェクトをインスタンス化できません。
COM +アプリケーションは、VB6に組み込まれた3つのDLLで構成されています。データ、アプリケーション、プレゼンテーションの各レイヤーにそれぞれ1つのDLLがあります。Webアプリケーションは、プレゼンテーション層のオブジェクトのみを使用します。COM + DLLは、COMを介して公開されたいくつかの.NETDLLを呼び出します。
Webアプリケーションを実行すると、HTTP 500 - Internal Server Error
が返されます。アプリケーションまたはシステムログにエラーは表示されません。
を使用してVBScriptからオブジェクトをインスタンス化しようとしましWSH.CreateObject
たが、データレイヤー内のオブジェクトに対してのみ機能します。アプリケーションまたはプレゼンテーション層でオブジェクトを作成しようとすると、次のエラーが発生します。
Error: Could not create object named "My.ProgId"
Code: 800A801D
Source: WScript.CreateObject
VBScriptで失敗するため、ASPアプリは問題なく、問題があるのはCOM+アプリケーションであると思われます。
追加情報
COM +アプリケーションをアンインストールし、VBScriptを実行してインスタンス化をテストしようとすると、別のエラーが発生します。
Error: Could not locate automation class named "My.ProgId"
Code: 80020009
Source: WScript.CreateObject
エラーが異なるため、COMはインストール時に少なくともCOM +オブジェクトを検出しているように見えますが、それらをインスタンス化することはできません。
また、ProcessMonを使用してスクリプトを監視してみました。WScript.exe(COM経由)がレジストリにProgIDを照会し、次にCLSIDを照会しているのがわかります。最終的に、DLLへのパスがプルバックされ、svchost.exeとdllhost.exeがCLSIDを使用してレジストリに同じ情報を照会し、DLLへのパスも取得します。最終的に、DLLはそれに対してイメージのロード操作を行い、その後にmsvbvm60.dllに対して同じ操作を行います。COM+DLLへのアクセスの失敗を示すものは何も表示されません。
COM+アプリケーションを別のWin2k3サーバーとWindowsXPデスクトップにインストールしてみました。データレイヤーDLLからオブジェクトをインスタンス化できるのと同じ結果が得られますが、アプリケーションおよびプレゼンテーションレイヤーDLLからはインスタンス化できません。また、アプリケーション層DLLの古いコピーを取得しようとしましたが、そこからオブジェクトを正常にインスタンス化できます。ただし、2つの異なるバージョンのプロジェクトファイルを比較すると、この問題の考えられる原因として目立つものはありません。