2009-04-07 38 views
4

Vista x64でVisual Studio 2008でWCFサービスライブラリを作成することは、x86 DLLを参照する際に面倒です。 32ビットDLLを呼び出すサービスは、64ビットOS上で実行するためのプラットフォームターゲットがx86である必要があります。これを行うと、WcfSvcHostはサービスをデバッグしようとするとBadImageFormatExceptionをスローします。 MS接続にはbug reportがあります。私が使用した回避策はcoreflag WcfSvcHost as 32-bitです。WCfSvcHostおよびIIS WCFホストでBadImageFormatExceptionが発生しました

マニフェスト問題は

私は、このサードパーティのネイティブ32ビットのDLLであるためにで実行した主な問題は、特定のWCFのホストを使用してロードに失敗しました。

System.TypeInitializationException: 「」例外をスローしたためのタイプ初期化子サービス操作は、サードパーティのDLLを使用するに呼び出されたとき、私は、次のエラーメッセージが表示されます。

.ModuleLoadExceptionHandlerException: ネストされた例外は、C++ モジュールのロードに失敗する原因 主要例外後に発生しました。

System.BadImageFormatException:モジュールに アセンブリマニフェストが含まれていると予想されていました。 ( HRESULTからの例外:0x80131018)

NestedException:

ハンドルが無効です。 (HRESULTからの例外:0x80070006(E_HANDLE))WcfSvcHostの起動時

この例外が発生していないサービスの操作は、32ビットのDLLを参照する呼び出されたときに、それが上げています。 (

「WcfSvcHost.exe」:非常に興味深い何が、コンソールアプリケーションで同じapp.configを持つこの同じサービスをホスティングしても、例外を持っていないし、完璧に動作します:

using (ServiceHost host = new ServiceHost (typeof (MsgBrokerService))) { 
    host.Open(); 
    Console.WriteLine ("running"); 
    Console.ReadLine(); 

をこの例外は、右の後に発生します)の管理:ロード 'C:\ WINDOWS \ WinSxS \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_ none_d08d7bba442a9b36 \ msvcm80.dll'

ここでも、コンソールアプリはexceptioを持っていませんnと、同じDLLをロードします。

'ConsoleApp.vshost.exeは'(管理): ロード 「C:\ WINDOWS \ WinSxS \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_ none_d08d7bba442a9b36 \ msvcm80.dll 「

from Microsoft Product Supportにお答えください。

Update#1:コンソールアプリケーションとWcfSvcHost.exeホストプロセスの両方が、同じセッションおよびログインユーザー(私)で実行されます。私はWcfSvcHostをコピーしました。exeファイルを手動で起動し、同じ結果を経験したディレクトリに移動します。また、Windowsイベントログで追加情報を確認してsxstraceを使用しましたが、何も記録されませんでした。

  • 画像::32ビット
  • 現在のディレクトリ
  • ユーザー/ SID
  • セッション
  • プロセスエクスプローラを実行

    は、私は次の2つのプロセス間で同じです確認しました

  • セキュリティ(グループ拒否、特権無効)

プロセスモニタを実行していて、configuring symbols、WcfSvcHostが次のレジストリとファイルを探しますが、コンソールホストは表示されません。 プロセスモニタは、大量のデータを記録し、私は:(を探しているかわからないんだけど

HKLM \ SOFTWARE \マイクロソフト\フュージョン\ PublisherPolicy \デフォルトの\ policy.8.0.msvcm80__b03f5f7f11d50a3a C: \ WINDOWS \アセンブリ\ GAC_32 \ msvcm80 8.0.50727.3053__b03f5f7f11d50a3a C \:\ WINDOWS \アセンブリ\ GAC_MSIL \ msvcm80 \ 8.0.50727.3053__b03f5f7f11d50a3a C:\ WINDOWS \アセンブリ\ GAC \ msvcm80 \ 8.0.50727.3053__b03f5f7f11d50a3a

更新#2:この同じ例外は、サービスがでプロダクションでホストされている場合に発生しますサードパーティ製の32ビットの.NETアセンブリがStreamBase API次のとおりです:

  • sbclient.dll(管理)
  • monitor.netmodule(IIS 6 /のWindows Server 2003

    アップデート#3に管理)

  • dotnetapi.dll(管理対象外)
  • のpthread-vc8.dll(アンマネージド

更新#4:追加

  1. dotnetapi.dllとpthreads-vc8.dllがRT_MANIFESTを持っていることを確認しました。 sbclient.dll .NETのアセンブリがGAC
  2. からマニフェスト
  3. 削除sbclient.dllを持っていなかった
  4. をスキップ検証のために登録sbclient.dllはsbclient.dllとmonitor.netmodule
  5. 両方に mt.exe介しマニフェストを追加しました
  6. 検証済みのマニフェストが追加され、テスト中に予想されるファイルが読み込まれた(Visual Studio - デバッグモジュールウィンドウ経由)
  7. 同じBadImageFormatExceptionがBackgroundWorker.OnDoWork()でスローされ、呼び出しスタックがdotnetapi.dll ... DefaultDomain.Initalize()。

私はmsvcm80を確認しました。

:dllのマニフェストを持って、私はこれが唯一のファイルがロードされていることがマニフェスト:)を持っていないと信じていません

興味深いは

私はReflectorでmonitor.netmoduleをロードすると、それは言うを見つけます

'monitor.netmodule'にはアセンブリマニフェスト が含まれていません。

エラーを表示しても、Reflectorは引き続き管理コードを逆アセンブルできます。

+1

サードパーティの32ビットDLLとは何ですか? –

+0

StreamBase - details above –

+0

おそらくDLLの作者はそれを消費したくなく、それをインポートしようとするとDLLを破壊するために何らかの邪悪なobfuscatorを適用したでしょうか? – Spence

答えて

1

マイクロソフト製品サポートはこの疑問を解決した:それはデザインであります。 WcfSvcHostまたはIIS WCFホストを使用している場合、アンマネージコードは既定のAppDomainに読み込まれません。

純粋な画像では、Cランタイムライブラリ のCLRバージョンを使用します。ただし、 CRTは検証できませんので、 /clr:safeでコンパイルする場合は CRTを使用できません。詳細については、C 実行時ライブラリを参照してください。少し遅れ

http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx

0

サービスとして実行されるコンテキストとコンソールに配置されたときに実行されるコンテキストとの間に権限の違いがあるという最初の疑いがあるだけで、エラーの説明はできません応用。 E_HANDLE HRESULTは私のここの手掛かりです。ログインしたユーザーとしてコンソールアプリケーションを実行すると仮定すると、そのユーザーとして開始するようにサービスを構成することもできます。その構成で動作する場合は、失敗したときに必要なリソースが使用できないものを絞り込むことができます。

回避策を提案できます。問題のDLLがホストされているサービスで動作しないようにするには、問題のDLLが奇妙な場合は、通常は頻繁にクラッシュするDLLを隔離するために使用されるため、犠牲プロセスアプローチを採用することができます。簡単に言うと、名前付きパイプまたはその他のIPCメソッドを使用して要求と結果を渡すことによって、メインプロセスの代わりにDLLをロードして呼び出すことだけを目的とするプロキシプログラムを作成します。 DLLがクラッシュすると、プロキシプログラムの新しいインスタンスが開始されます。あなたの場合、ラッパープログラムだけが32ビットである必要があるという追加の利点があります。

0

イベントビューアで何か特別なことはありますか?
Vistaではマニフェストに問題がある場合は、イベントビューアにその痕跡が表示されます。SxsTraceを使用するように指示されます。

4

いますが、高度な設定でtrueに「3​​2ビットアプリケーションを有効にする」に設定アプリケーションプールを変更することができます。

0

これはちょっとばかげているようです。サービスが正しいアプリケーションプールで実行されていることを確認してください。

+0

サードパーティコードのバグでした。 –

関連する問題