1. ホーム
  2. アセンブリ

ファイルまたはアセンブリを読み込めませんでした ... 不正なフォーマットでプログラムをロードしようとしました。

2022-02-09 11:49:57

i. エラー

このエラーは、少し前に発生したものです。

" ファイルまたはアセンブリ 'R.. .tools, Version=1.0.0.0, Culture=neutral, PublicKeyToken=21ef81843f5d77b6' またはその依存関係の 1 つをロードできませんでした。不正なフォーマットでプログラムをロードしようとしました。 "

非常に汎用的なクラスをDLLに追加したところです。

あまりに当たり前すぎて、呼び出したらエラーになりました。そこで、そのクラスを削除したのですが、やはりエラーになりました。でもdllは正常に動いているので、ググってみたらまた64bitの問題だった!?なぜ、"again"があるのか、そう、windows server 2008 R2でSharePointを開発していると、32bitと64bitの互換性の問題に何度も遭遇しているのです。

II. その理由

その上の普通のクラスを追加する前に、下記を使ってエクセルアクセスクラスを追加しました。

@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fullFilePathAndName + @";Extended Properties=""Excel 12.0;HDR=YES;""""

この excel access クラスを正しく呼び出せるようにするには、プロジェクトのプラットフォームターゲットを x86 に変更する必要があり、そうしないと以下のエラーが発生します。

System.InvalidOperationException: Microsoft.ACE.OLEDB.12.0' プロバイダがローカルマシンに登録されていません。

そこで、DLLとDLLを呼び出すアプリケーションのプラットフォーム・ターゲットの両方をx86に変更したところ、Excelアクセス・クラスを正しく呼び出すことができました - これが最初のエラーでした。

他のクラスやメソッドをテストしていないので、中にはx64環境でしか動作しないものがあるかもしれません。

III. 解決方法

  • DllのプラットフォームターゲットをAny CPUに戻す。
  • そのDLLを呼び出すアプリケーションをx86に変更します。

これで解決です。つまり、呼び出し側だけがプラットフォームターゲットをx86に変更する必要があり、呼び出し側は何もする必要がなく、任意のCPUのままなのです。

しかし、メインアプリケーションが、x64環境でしか利用できないDLL内のクラスも呼び出したい場合、同じエラーが発生するため、どうすればいいのか?x86のメソッドを使わずに、エクセルにアクセスする方法を変えるしかないでしょうね。

IV. その他の解決策

ネットで見つけたので、まだ試していませんが、また同じようなエラーが発生したときに役に立つかもしれません。

  1. 使用方法 ProcMon.exe (マイクロソフトの無料ツール)を使って、どのDLLがどこで呼び出されているかを正確に確認することができます。
  2. 64ビット環境で32ビットプログラムを許可するようにIISで設定する。

     (1) コマンドラインで以下のディレクトリを開きます。

cd システムドライブ%/Inetpub/AdminScripts

     (2)以下のコマンドを入力します。

cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 1

V. 参考文献

<スパン <スパン http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/13f991a5-45eb-496c-8618-2179c3753bb0.mspx?mfr=true