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:追加
- dotnetapi.dllとpthreads-vc8.dllがRT_MANIFESTを持っていることを確認しました。 sbclient.dll .NETのアセンブリがGAC からマニフェスト
- 削除sbclient.dllを持っていなかった
- をスキップ検証のために登録sbclient.dllはsbclient.dllとmonitor.netmodule 両方に mt.exe介しマニフェストを追加しました
- 検証済みのマニフェストが追加され、テスト中に予想されるファイルが読み込まれた(Visual Studio - デバッグモジュールウィンドウ経由)
- 同じBadImageFormatExceptionがBackgroundWorker.OnDoWork()でスローされ、呼び出しスタックがdotnetapi.dll ... DefaultDomain.Initalize()。
私はmsvcm80を確認しました。
:dllのマニフェストを持って、私はこれが唯一のファイルがロードされていることがマニフェスト:)を持っていないと信じていません興味深いは
私はReflectorでmonitor.netmoduleをロードすると、それは言うを見つけます
'monitor.netmodule'にはアセンブリマニフェスト が含まれていません。
エラーを表示しても、Reflectorは引き続き管理コードを逆アセンブルできます。
サードパーティの32ビットDLLとは何ですか? –
StreamBase - details above –
おそらくDLLの作者はそれを消費したくなく、それをインポートしようとするとDLLを破壊するために何らかの邪悪なobfuscatorを適用したでしょうか? – Spence