3

私はVS10で次のプロジェクトを書きました:

  • を呼び出す C# (.net 4.0) プログラム
  • boost::thread を利用する C++ アンマネージ dll
  • C# 実行可能ファイル、C++ dll、boost::thread dll、その他のファイルを含むセットアップ プロジェクト。さらに、インストール中にフレームワーク .net 4.0 がインストールされているかどうかがチェックされ、インストールされていない場合はダウンロードされます。

コンパイル (3 つのプロジェクトのそれぞれで x64) は問題なく、プログラムは私の PC (Windows 7 64 ビット) で動作します。他のコンピューター (すべて Windows 7 64 ビット) でプログラムをテストしたところ、次のことがわかりました。

  • VS10とBoostを搭載したものでは、プログラムが機能します
  • VS10 および Boost を使用しないプログラムでは、C++ Dll でエラーが発生します。

問題は、一部のブースト Dll が欠落していることだと思います。私は正しいですか?または、問題はVSに関連している可能性がありますか?

編集

プログラムの構造は次のとおりです。

  • いくつかのパラメーターが設定されているメイン フォーム (C#)、次に backgroudworker が呼び出す
  • 独自の処理を行い、boost::thread を使用する C++ DLL
    • それはいくつかの計算を行います
    • 結果が得られると、それらをファイルに書き込みます
    • その計算などを続行します
  • メインフォームには、結果ファイルを探して結果を処理する filesystemwatcher があります。

また、エラーが発生すると、メインフォームが正しく読み込まれ、パラメーターを設定できました。エラーは、バックグラウンド ワーカーが自分の作業を開始する (C++ DLL を呼び出す) ときに発生します。

したがって、フレームワークのインストールに問題はないと確信しています。

更新

セットアップ プロジェクトにいくつかの DLL を含めるのを忘れていたことが判明しました。今、それらを含めてエラーが変更されました。

さて、以前と同じ時点で (そして同じコンピューター上で) 別のエラーが発生します。

BadImageFormatException: 不正な形式のプログラムをロードしようとしました

この記事を読みましたが、C# プロジェクトと C++ DLL の両方で x64 を設定しており、セットアップ プロジェクトは TargetPlatform x64 になっています。何か案が?

4

4 に答える 4

3

VCRedist パッケージがターゲット マシンにありません。VS SDK ディレクトリで利用できるはずです。また、ターゲット マシンに .Net Framework をインストールする必要がある場合もあります (.Net Framework には VCRedist パッケージが含まれています)。それらのインストール ファイルがない場合は、Microsoft サイトで入手できます。つまり、x64 用の VC10Redist はこちらです。

于 2013-01-03T10:33:30.210 に答える
3

そのような場合、ツールDependency Walkerを使用します

それを起動し、実行可能ファイルを選択して、不足しているライブラリを見つけます。

インストールに必要なものを示す手がかりを提供します。

于 2013-01-03T10:40:38.357 に答える
2

C++ DLL がCRT に動的にリンクされている場合は、VC++ CRT DLL、つまりMSVCR100.DLLC++MSVCP100.DLLもターゲット マシンに展開する必要があります (これらは、VS2010 がインストールされている開発マシンで既に利用可能であるため、そのマシンではC++ DLL は正常にロードされますが、クライアントのマシンで CRT/C++ DLL が利用可能であるとは想定できません)。

いくつかの展開オプションがあります。MSDNでこのドキュメントを読むことをお勧めします。

于 2013-01-03T10:36:21.053 に答える
1

私はついに解決策を見つけました!

C++ DLL は、正しい丸めを使用した多精度浮動小数点計算のためにmpfrライブラリを必要とします。

ライブラリの間違ったバージョン (x86) を含めていました (残念です!)。これがエラーの原因でした:

BadImageFormatException: 不正な形式のプログラムをロードしようとしました

次に、プログラムが正常だったすべてのコンピューター (3 つの異なるコンピューター!) で、両方がありました (不運で誤解を招く偶然の一致):

  • BoostとVS10を搭載し、
  • Path 環境変数に含まれるフォルダー内のライブラリの x64 バージョン。したがって、何らかの方法で、プログラムは適切なバージョンの DLL を見つけました。

セットアップ プロジェクトに適切なバージョンのライブラリを含めると、問題が修正されました。Kamil Klimek、Stephane Rolland、Mr.C64 の貴重な提案に感謝します。

于 2013-01-05T10:02:22.983 に答える