1

コンポーネントサービスを使用して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つの異なるバージョンのプロジェクトファイルを比較すると、この問題の考えられる原因として目立つものはありません。

4

1 に答える 1

1

アプリケーション層DLLはstruct、.NETアセンブリで定義されたものを参照していました。structこのエラーは、デプロイメントマシンに登録されていないを含むタイプライブラリが原因で発生しました。

Visual Studioで.NETアセンブリを構築すると、アセンブリのタイプライブラリが作成され、登録されます。アプリがデプロイされたとき、.NETアセンブリはを使用して登録されregasm /codebase <assemblyname.dll>ました。これにより、クラスがインスタンス化できるように登録されますが、構造体は登録されませんでした。

regtlib.exe解決策は、テストサーバーにタイプライブラリを登録するために使用することでした。

問題の原因を見つけようとしたとき、エラーメッセージはまったく役に立ちませんでした。マイクロソフトに来てください!

于 2012-03-01T23:01:48.810 に答える