2012-02-28 14 views
1

コンポーネントサービスを使用してMSIにエクスポートされ、テストサーバーにインストールされたCOM +アプリケーションがあります。 Webアプリケーション(ASP)は、COM +アプリケーションから使用するオブジェクトをインスタンス化できません。エクスポートされたアプリケーション経由でインストールされたCOM +オブジェクトをインスタンス化できません

COM +アプリケーションは、VB6でビルドされた3つのDLLで構成されています。データ、アプリケーション、およびプレゼンテーションレイヤーごとにそれぞれ1つのDLLがあります。 Webアプリケーションは、プレゼンテーションレイヤーからのオブジェクトのみを使用します。 COM + DLLは、COM経由で公開されているいくつかの.NET DLLを呼び出します。

Webアプリケーションを実行すると、HTTP 500 - Internal Server Errorが返されます。アプリケーションまたはシステムログにエラーは表示されません。

WSH.CreateObjectを使用してVBScriptからオブジェクトをインスタンス化しようとしましたが、データレイヤー内のオブジェクトに対してのみ機能します。アプリケーションまたはプレゼンテーション層でオブジェクトを作成しようとすると、私は次のエラーを取得する:

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にはLoad Imageオペレーションがあり、それに続いてmsvbvm60.dllも同様に動作します。 COM + DLLへのアクセスに失敗したことを指摘するものは何も表示されません。

これでCOM +アプリケーションを別のWin2k3サーバーとWindows XPデスクトップにインストールしようとしました。データレイヤーDLLからオブジェクトをインスタンス化することはできますが、アプリケーションレイヤーとプレゼンテーションレイヤーDLLではインスタンス化できないという同じ結果になります。私はまた、アプリケーション層のDLLの古いコピーを取得しようとしたと私はは、そこからオブジェクトを正常にインスタンス化することができます。しかし、2つの異なるバージョンのプロジェクトファイルを比較すると、この問題の原因としては目立ったものはありません。

+0

あなたのプレゼンテーションレイヤーのdllに 'Main'ルーチンがありますか?初期化しようとしているオブジェクトに 'Class_Initialise'がありますか?もしそうなら、あなたはこれらの場所にどのような例外処理を配置しましたか?プレゼンテーションレイヤーとビジネスレイヤーには、ターゲットサーバー上に存在しない他の依存関係がありますか? – AnthonyWJones

+0

'Main'ルーチンはなく、' Class_Initialise'もありません。いくつかのクラスは 'ObjectControl_Activate'を持っていますが、メソッドが呼び出されるまでは呼び出されません。 'ObjectControl_Activate'の内部を含むいくつかのメソッドに存在するエラー処理は、従来のVB6' On Error GoTo X'エラーハンドラであり、 'App.LogEvent'を使ってエラーをイベントログに記録し、新しいエラーを発生させます。私はすべての依存関係がインストールされていると信じていますが、私は二重チェックします。 – GiddyUpHorsey

+0

私の開発マシンでは、問題が発生したときにエラー処理コードが正常にイベントログに書き込んでいます。テストサーバーでは、イベントログはDLLによって書き込まれません。 – GiddyUpHorsey

答えて

1

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

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

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

問題の原因を発見しようとすると、エラーメッセージは役に立たなかった。マイクロソフトに来てください!

関連する問題