2011-01-11 33 views
2

私は.NET 4.0アプリケーションを実行しています。  x64ビットOS + Office 2010(64ビット互換のプロバイダMicrosoft.ACE.OLEDB.12.0 )。BadImageFormatExceptionがローカルマシンに登録されていません。

プラットフォームターゲットのx86:

  • プロバイダの問題:

    'Microsoft.ACE.OLEDB.12.0' プロバイダはローカルマシンに登録されていない

プラットフォームターゲットx64または任意のCPU

  • DLLファイルの問題:

    System.BadImageFormatException:ファイルまたはアセンブリをロードできませんでした。 'Interop.SHDocVwを、バージョン= 1.1.0.0、カルチャニュートラル、PublicKeyToken = = null' またはその依存関係の1つ。不正な形式のプログラムをロードしようとしました。

+0

この参照されたDLLは32ビットでコンパイルされていますか?その例外は、私が考えるクロスビットの参照に由来します。 –

+0

DLLは32ビットですが、これを修正する方法はありますか? – thedev

+0

残念ながら、64ビットのDLLを入手するか、独自のDLLを32ビットとしてコンパイルする以外に、これを回避する方法はありません。異なるビット数のDLLは同じプロセスに存在することはできません。 –

答えて

3

最初の問題は、プロバイダの32ビットバージョンをインストールすることで解決できます。 is hereをダウンロードしてください。

2番目の問題は非常にです。interopライブラリにはILのみが含まれ、プロセッサアーキテクチャに依存しないようにする必要があります。私はCからの相互運用機能DLLを作成する場合:\ WINDOWS \ SYSTEM32 \ Shdocvw.dllは、その上にCorFlags.exeを実行し、私はこの取得:ILONLYがオンになっているか

Version : v2.0.50727 
CLR Header: 2.5 
PE  : PE32 
CorFlags : 1 
ILONLY : 1 
32BIT  : 0 
Signed : 0 

は注意を、32BITはオフになっています。これは64ビットマシン上で動作するはずです。私は今すぐチェックする人には近くないので、これを自分で試してみてください。より良い回答を得るには、インストールしたInternet Explorerのバージョンと、interopを生成するためにDLLの64ビットまたは32ビットバージョンを使用したかどうかを記録してください。後者はc:\ windows \ syswow64ディレクトリにあります。

1

私がコメントで指摘したように、これはおそらくリファレンスDLLが32ビットであるためです。私は最近この問題を抱えていました.1つのプロセスにさまざまなビットのDLLをロードすることはできません。この問題を回避するには、理想的にDLLのビット数を等しくする必要があります。

これは本当にオプションではない場合は、問題のDLLを格納するための新しいプロセスを作成し、IPCを使用してコールをマーシャリングすることができますが、これは理想的ではありません。私は、正しいビット数の別のDLLを使ってDLLをシムにする方法もあると信じていますが、クロスプロセスの呼び出しを再度マーシャリングしている可能性があります。

64ビットアプリケーションから32ビットのDLLにアクセスするために過去にIPCを成功裏に使用しました。幸いにも私にとって、マーシャリングには複雑なことはありませんでしたが、それは基本的なチャンクな要求応答のセマンティクスでした。

+0

私は同意する、私はこれが問題だと思っていたが、確かではなかった。アドバイスをありがとう;) – thedev

0

一時的な解決策として、x86用プロジェクトでビルドプラットフォームターゲットを変更することができます。

関連する問題