1

最近変更したプロジェクトがあります。プロジェクトは.NETで記述され、x64マシン用にコンパイルされています。データベースと対話するために構築したDataEntitiesモデルがあります。ただし、エンティティフレームワークモデルに接続しようとすると、エラーが発生します。

エンティティフレームワークのedmxファイルはDataCentral.edmxと呼ばれます。このファイルを使用すると、インスタンスに接続するために実行しようとしているコードは非常に単純です。

        string cs = CSManager.GetConnectionString();
        DataCentralEntities ctx = new DataCentralEntities(cs);

これらの2行を実行すると、次の例外を除いて2行目でクラッシュします。

Could not load file or assembly 'Interop.SHDocVw, Version=1.1.0.0, 
Culture=neutral, PublicKeyToken=null' or one of its dependencies. 
An attempt was made to load a program with an incorrect format.

x86として実行すると(他の理由で長期的には不可能です)、問題なく実行されます。接続文字列を確認しましたが、正しくフォーマットされています。

これが私の質問です:私は新しい変更のいずれにもShDocVwを使用していません。実際、このエラーに遭遇するまで、私はそれを聞いたことがありませんでした。一体何がこれをここで吐く原因になるのでしょうか?私が行方不明になっているのは何ですか?

アップデート

おそらく.NET2.0の頃に作成されたフォームを見つけました。(おそらくもっと早いです。)ShDocVwライブラリを介してWebブラウザコントロール(公式のWebBrowserコントロールではない)への参照を作成しました。どうやら、これは公式のコントロールが登場する前に、ウェブブラウザをアプリに埋め込むかなり一般的な方法でした。

このフォームをアップグレードして、公式のWebBrowserコントロールを使用し、プロジェクト内のShDocVw.dllへのすべての参照を削除しました。これで、x64でもすべてが期待どおりに機能します。

私がまだ理解していないのは、ShDocVw.dllへの参照がプロジェクトにあるときにEntityFrameworkがその行でクラッシュする理由です。その部分は私には意味がありません。しかし、私たちは今、立ち直っています。

4

1 に答える 1

2

場合によっては、EntityFrameworkがメインアセンブリによって参照されるアセンブリを読み込もうとしています(特に、EFがプリコンパイルされたビューを探しているときに発生します)。あなたの場合、これは例外を引き起こし、これは32ビットアセンブリを64ビットプロセスにロードする原因になります。他の何かがこのアセンブリをロードしようとした場合にも同じことが起こることに注意してください。64ビットアセンブリを使用するか、プロジェクトを32ビットとしてビルドする必要があります。もう1つのオプションは、Corflagsを使用して開始アセンブリを32ビットに設定することです。これにより、64ビットマシンで32ビットプロセスが作成されるため、以前に問題が発生したアセンブリをロードできます。

于 2013-03-12T02:22:49.703 に答える