質問: 現在、WinFroms(C#)でアプリケーションを開発しているのですが、webサイトをアプリケーションに埋め込んで使用するのにCefSharpを使っています。 Debug/Releaseで実行すると問題なく動くのですが、bin/Releaseファイル内を別の場所へコピーして実行したりインストーラーを作成してインストールしてから実行すると下記のエラーが出てしまい実行出来ません。 実行するためにどのファイルを含めればいいか、どうすればいいかどなたかわかる方いませんでしょうか。 **発生するエラー** > > System.BadImageFormatException: ファイルまたはアセンブリ 'CefSharp.WinForms, Version=75.1.143.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。 > > > **環境** ・Windows10 64bit ・Visual Studio 2017 ・.NET Framework 4.5.2 また、関係あるかは分かりませんがAnyCPUに対応するため(CefSharpのインストール後x64,x86ビルドも出来なかった) https://www.valuestar.work/news/archives/27 を参考にしました。 **追記** 私の環境は64bitですので試しにx64フォルダ内をexeと同じ(root)フォルダにコピーして起動してみたらあっさり動きました。 ただこれでは解決になっていなくて、AnyCPUに対応できていないままですのでどうにかしてAnyCPUに対応させたいです。x86とx64でそれぞれ必要なファイルがフォルダごとに分かれているのですが、これをうまく認識してくれていないみたいで...。インストーラーに至ってはインストール時にそのフォルダを含めてくれない(認識されていないのが原因?)です。どなたか知恵をお貸し下さい...。 **追記2** インストーラーはVisual Studio Installer Projectsを使用しています。 コードはほぼリンク先のままです。
回答: ご質問の状況を確認してみました。 > > Debug/Releaseで実行すると問題なく動くのですが、bin/Releaseファイル内を別の場所へコピーして実行したりインストーラーを作成してインストールしてから実行すると下記のエラーが出てしまい実行出来ません。 > > > 問題の原因としては既にある程度推察されているとおり、EXE実行ファイルから見たアセンブリDLLファイル群の配置場所です。 質問者さんが参考にされたサイト様の記事 CefSharpでAnyCPU対応に苦慮した話2 の アセンブリを動的にロードする以下のコードは、実行ファイルの存在するディレクトリと実行時のプロセス(64ビットまたは32ビット)に応じて"x64/", "x86/"ディレクトリを切り替えているわけですから、 ``` ...※当該記事より抜粋の上、転載させていただいております。 string assemblyName = args.Name.Split(new] { ',' }, 2)[0] + ".dll"; string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, Environment.Is64BitProcess ? "x64" : "x86", assemblyName); return File.Exists(archSpecificPath) ? Assembly.LoadFile(archSpecificPath) : null; ``` 実行時のファイルの配置としては以下のようになっていなければならないはずです。(WinForms1.exe がCefSharpを組み込むEXE実行ファイルであるとします) ``` ./ │ WinForms1.exe │ ├─x64/ │ CefSharp.Core.dll │ CefSharp.dll │ CefSharp.WinForms.dll │ ...色々 │ └─x86/ CefSharp.Core.dll CefSharp.dll CefSharp.WinForms.dll ...色々 ``` この配置が守られていればメインのEXEがAnyCPUであろうと、x86、x64であろうと、正しく動作します。(NuGetでインストールした CefSharp.Common.75.1.143, CefSharp.WinForms.75.1.143 で確認済み) Visual Studio Installerでファイルを配置するときも、このことを考慮して行えばインストーラーは作成できるかもしれません。下の画像は、x64とx86下にファイルを配置しようと試みた例です。ただし私の方では完成させておらず、未確認です。 ![イメージ説明 Visual Studio Installerはインストーラーを作成するには簡易的なツールであり(<と、私は思っています)、細かい制御は大変そうに思いました。私ならばVisual Studio Installerではなく、WiX(Windows Installer XML)を使ってしまうと思います。 尚、CefSharpを組み込んで実行すると自動的に「GPUCache」などのディレクトリやファイルが多数生成されました。インストーラーを作成するときは、これらの配置場所も考慮する必要があるかと思います。 個人的な意見ですが、Windowsが64ビット版であろうと32ビット(x86ビルド)の実行ファイルは動作するので、リリースする製品の形態によっては無理にAnyCPUで64ビット版と32ビット版を振り分けず、32ビット版のみでも良い気がします。他プログラムと連携する都合上、64ビット版Windowsであるときは64ビットプロセスで動作しないといけない、と言う要求があるのであれば仕方ありませんけれども。