3

WCF サービスで次のランタイム エラーが発生します。

Could not load file or assembly 'MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

いろいろ調べたところ、Assembly Binding Log ViewerまたはProcess Monitorを使用する提案が見つかりました。どちらも、または何の情報も得られませんでした (つまり、ログ ビューアーには何も表示されず、プロセス ビューアーには、試行されているアセンブリの読み込みが表示されませんでした)。

私は最終的に、このユーティリティ (依存関係ウォーカー)を使用して、アセンブリが実際に探しているものを見つけるという提案に出くわしました。開くとすぐにエラーが発生しました。ログには次のように記載されていました。

エラー: CPU タイプが異なるモジュールが見つかりました。警告: 少なくとも 1 つの遅延読み込み依存モジュールが見つかりませんでした。警告: 遅延ロード依存モジュールにエクスポート機能がないため、少なくとも 1 つのモジュールに未解決のインポートがあります。

Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

モジュールリストによると、これらは見つかりませんでした:

API-MS-WIN-CORE-COM-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL
DCOMP.DLL
IESHIMS.DLL

これらのいくつかは、RT フレームワークに関連しているように見えます。ただし、このアプリケーションは .NET 3.5 で開発されました (実際には、厳密にはそうではありません。4.5 で開発され、3.5 にダウングレードされました)。

これらのファイルのいくつかを見ると、それらが非常にコアな Windows ファイルであることを暗示しているように思われます。奇妙なことに、私はこの dll をソリューションの別の場所で (クライアント上で) 問題なく使用しました。

私はVS2012を試してみましたが、同じ問題が発生しましたが、VS2013を使用しています。

C ++に関連していますが、一見同じように見えるこの質問に出くわしました。

問題が何であるか、または次に何を試すべきかについて、誰かが私にガイダンスを与えることができますか?

これが私の融合ログです:

=== Pre-bind state information ===
LOG: DisplayName = MyAssembly.MyLib.XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, processorArchitecture=MSIL (Fully-specified)
LOG: Appbase = file:///c:/myprog/bin/Debug/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = myprog.exe
Calling assembly : System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: c:\myprog\bin\Debug\myprog.exe.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).

問題のライブラリを、文字列を返す単一の静的関数になるまで減らすことができましたが、それでもエラーが発生しました。

4

8 に答える 8

3

このエラーを解決するのに常に役立ったのは、エラーメッセージの「またはその依存関係の1つ」と書かれている部分を詳しく調べることでした。

于 2013-11-01T11:24:17.297 に答える
3

WCF を使用した Visual Studio には癖があります。選択したプラットフォームを使用してビルドすると、プラットフォーム固有のフォルダーにアセンブリがダンプされます。「Any CPU」でビルドすると、WCF の「Bin」フォルダーのルートに配置されます。

IIS を構成するときに役立ちますか? アセンブリがその「Bin」フォルダーのルートにあると自動的に想定します。

正味のイベントは、「Any CPU」の代わりに「x86」を選択すると、アセンブリが間違った場所にビルドされ、突然 WCF が実行されなくなることです。したがって、これは、ファイルまたはアセンブリを読み込めないというキャッチオール エラーが文字通りの真実を伝えている、数少ないまれなケースの 1 つです。Visual Studio はアセンブリを間違った場所に置き、それを見つけることができません。

なぜ彼らがそのようなことをしたのか、私にはわかりません。WCF には、いくつかの興味深い設計上の決定があります。

于 2013-11-05T20:13:57.920 に答える
0

このエラーは通常、プロジェクトが Visual Studio/Asp.Net の上位バージョンで開発され、実行/デプロイされたマシンのバージョンが下位の場合に発生します。まず、両方のマシンの Visual Studio のバージョンを確認します。

于 2013-11-05T14:27:42.860 に答える
0

wcf で同じ問題が発生しました。プロジェクトが機能していて、wcf サービスを追加した後、svc ファイルの読み込みが停止し、同じ問題が発生しました。何も機能せず、最後にサービスを削除してマシンを再起動しました。すべてを再構築し、最後にサービスを再度追加しました。

于 2014-03-06T14:47:19.660 に答える
0

複数のプロジェクトがある場合、Visual Studio でアプリケーションを実行すると、一部のプロジェクトがビルドされない可能性があります。ソリューションを右クリックし、[プロパティ]、[構成プロパティ] に移動して、すべてのプロジェクトがコンパイルするように設定されていることを確認します。

于 2013-10-29T03:39:54.633 に答える
0

ここに来たのは私だけではないようです。他の誰かに役立つ場合に備えて、これをそのままにしておきます。

http://social.msdn.microsoft.com/Forums/en-US/9f0c169f-c45e-4898-b2c4-f72c816d4b55/strange-xmlserializer-error?forum=asmxandxml

エラーを無視してください...どのように機能するはずですか!?

編集:

今後の参考のために、この回答の削除を取り消しました。私はついに問題を解決しました。上記の問題ではなく、私が取り組んでいたソリューションに固有の IIS の問題でした。コンパイル済みの WCF バイナリを共通の場所にコピーするポスト ビルドがありましたが、明らかに新しい依存関係は含まれていませんでした。

最も近い回答に賞を与えます。

于 2013-10-30T11:39:12.583 に答える
0

見つけられなかったのは、いつもそこにないからです。
当たり前のように聞こえるかもしれませんが、頭を整理するのに役立つ場合もあります => そこにないものがあります。
次に、実装から定義を分離するという原則を覚えている場合は、インターフェイスとサービスを含むライブラリをサービスの外部 dll に移動する必要があることを意味します。
動作するコードを外部化したので、それ自体が組み込まれている場合は、実装だけが残っています。格下げされたソリューションである実用的なアプローチは、プロジェクトが「おかしくなった」ということです。
タスクに固有の新しいプロジェクトをバージョンにします。これには、ライブラリへの参照と、thisismyservicename.svc のような名前の 1 行のファイルだけが含まれている可能性が高いため、アドレスとバインディングだけでなく、システムをコピーするのは非常に簡単です。 web.config の .servicemodel 部分。
元のプロジェクトには何も残っておらず、安全にフラッシュできます。

于 2013-11-05T08:43:59.783 に答える