cefsharpをMicrosoft Visual C++ 再頒布可能パッケージなしで起動させる

2020年3月3日

Microsoft Visual C++ 再頒布可能パッケージがないと発生するエラーの内容

特定の端末で以下のようなエラーが出た。

System.IO.FileNotFoundException: ファイルまたはアセンブリ ‘CefSharp.Core.dll’、またはその依存関係の 1 つが読み込めませんでした。指定されたモジュールが見つかりません。
ファイル名 ‘CefSharp.Core.dll’ です。’CefSharp.Core.dll’

このようなエラーが発生した場合は、CefSharpの実行ファイルに合わせて32ビットか64ビットでインストールすればほぼ治ります。
Visual Studio 2015、2017、および 2019 用 Microsoft Visual C++ 再頒布可能パッケージとかいうやつ。

っで、今回は再頒布可能パッケージをインストールできない場面に遭遇したので、なんとか動かないか模索した記録となります。
結果的にはちゃんと動いた。必要なdllを配置してやればいける。

調査の流れ

色々とググっていると、以下の記事を見つけた。
https://stackoverflow.com/questions/54755445/how-to-include-vc-redistributable-files-needed-by-cefsharp
見ていると、
CefSharp v63.0.3以下を使用している場合は

・msvcp120.dll
・msvcr120.dll

CefSharp v65.0.0-pre01以降を使用する場合は

・msvcp140.dllまたはmsvcp141.dll
・msvcr140.dllまたはmsvcr141.dll
をbin直下に配置してやればよいとのこと。
どちらのファイルも、開発用PCのC:\Windows\System32またはC:\Program Files (x86)\Microsoft Visual Studio[Version][Edition]\VC\Redist\MSVC[Version][x64|x86]\Microsoft.VC150.CRTフォルダーにあるとのことなので、コピーすることに。

しかし、なぜか私の環境ではmsvcr140,msvcr141が見つからない。

どうしようと思って先を読んでいくと、同じようにmsvcr140.dllが見つからないと書いている人がいた。
代用としてvcruntime140.dllを使えばいい旨が書いてあった。

ということで、
・msvcp140.dll
・vcruntime140.dll
を用意して、対象の環境でCefSharpを起動した。

しかし、やはり同様にFileNotFoundExceptionが発生する。
何か足りないのかと思い、もう一つのCefSharp(x64)で実行すると開けた。

これだけ見ると、どうも上記dllの実行ファイルが適切でない(x86で動かすべきなのに、x64のdllを使っている?)可能性が考えられる。
ということで、ここからそのdllが32ビットか64ビットか確認する必要が出てきた。

実行ファイルが32ビットか64ビットか確認する方法
https://qiita.com/oyan29/items/1f0b5d227765115b24f0

残念ながら、私の環境でdumpbin.exeが見つからないというめんどくさい状態。
どうやらVisual StudioでCommon Tools for Visual C++を入れないといけないとのことだったので、
Visual Stuido InstallerでC++のワークロードを一式入れることにした。

Visual Stuido InstallerでC++のワークロードを一式入れると、dumpbinが使えるようになった。
調べたいdllのフルパスをコピーして以下のコマンドを実行すると、32ビットか64ビットか確認することができた。
dumpbin /headers C:\Users\xiaot\cmsvcp120.dll | findstr machine
8664 machine (x64)
やはり予想通り、使っていたdllがx64だった。
なので、ここからは必死のパッチでx86のdllを探す作業となる。

必要なdllの置き場所

stackoverflowに配置パスが書かれてあった。以下の場所です。
C:\Program Files (x86)\Microsoft Visual Studio[Version][Edition]\VC\Redist\MSVC[Version][x64|x86]\Microsoft.VC150.CRT

で、ここからx86用のdllを探して、dumpbinでdllを調べると、ちゃんとx86だというのがわかった。

残った疑問点

ところで、c++のワークロードを入れたからmsvcr140とか出てきたりするのだろうか。
結果的には、やはり見つからなかった。
以下のページを見ると
VCの再配布可能なファイルは、Visual Studio 2015で大幅に変更されました。
とあるので、これが関係しているのかもしれない。ただ、どのファイルが置き換わってという内容まではわからないので、確かではないです。
https://social.msdn.microsoft.com/Forums/ja-JP/ff32562d-efac-433e-8b03-7de614f894ec/visual-studio-2015-redistributable-files?forum=vcgeneral

C#C#, CefSharp

Posted by takumioda