C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 64bitOS上でexeが動作しない件について


(過去ログ 111 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■66099 / inTopicNo.1)  64bitOS上でexeが動作しない件について
  
□投稿者/ howling (318回)-(2013/04/01(Mon) 19:15:52)

分類:[.NET 全般] 

お世話になっております。

前スレ

 http://bbs.wankuma.com/index.cgi?mode=al2&namber=66009

こちらの内容がわかりづらいため、現状をまとめてみました。

環境は、Windows7 Pro(64bit) / VS2010 / C# & C++ & C++/CLIがexeを作成する側のPCです。
動作させる側のPCは、Windows7 Pro(64bit) または Windows8(64bit)で、
ともにVS関連の物は再頒布可能ランタイムパッケージのみインストールしている状態の物となります。


exeを作成する側のPCの環境に複数の言語が記載されていますが、こちらは

C++(NativeでDLLを作成しているプロジェクト。x86を対象コンピュータに指定)
C#(DLLを作成しているプロジェクト。AnyCPUを対象コンピュータに指定)
C++/CLI(DLLを作成しているプロジェクト。上の2つのプロジェクトから作成されたDLLを使用している。x86を対象コンピュータに指定)
C++/CLI(exeを作成しているプロジェクト。上から3番目の、C++/CLIで作成されたDLLを使用している。x86を対象コンピュータに指定)

の4つのプロジェクトを1つのソリューションに入れて動作させているため、このように記載してあります。


さて、上記のソリューションでコンパイル後、作成されたexeを64bitOS上で動作させると、

アプリケーションを正しく起動できませんでした(0xc000007b)

というエラーがメッセージボックスで表示されるのみで、デバッグも何もできません。
調べたところ、これは、64bitと32bitの読み込みが混在しているために起こっているようなのですが、
現在この問題を回避できておりません。

なお、コンパイルするPC(VS2010が入っている環境)では、問題なく動作しております。
原因が詳しくわからないのですが、何かご存知の方はいらっしゃいますでしょうか?

お手数ですが、宜しくお願い致します。
引用返信 編集キー/
■66101 / inTopicNo.2)  Re[1]: 64bitOS上でexeが動作しない件について
□投稿者/ とっちゃん (94回)-(2013/04/01(Mon) 19:30:41)
とっちゃん さんの Web サイト
No66099 (howling さん) に返信

> C++(NativeでDLLを作成しているプロジェクト。x86を対象コンピュータに指定)
> C#(DLLを作成しているプロジェクト。AnyCPUを対象コンピュータに指定)
> C++/CLI(DLLを作成しているプロジェクト。上の2つのプロジェクトから作成されたDLLを使用している。x86を対象コンピュータに指定)
> C++/CLI(exeを作成しているプロジェクト。上から3番目の、C++/CLIで作成されたDLLを使用している。x86を対象コンピュータに指定)
>
テスト環境のPCにて、新しくフォルダを用意し、これら4つの出力ファイルだけがある状態にして
EXEをエクスプローラでダブルクリックしてみてください。

この場合どうなりますか?
動作に必要なデータファイルなどは必要ありません。プロセスとしてロードできるかどうかが重要です。
起動処理の中で本来必要なファイルがなくてそこでエラーになるのであれば、作成したモジュール類に問題があるのではなく
実行しようとして準備した環境に問題があることになります。

この時点でエラーが出るのであれば、インストールしたランタイムパッケージがx64版で、x86版をインストールしていない可能性があります。
VS2010のインストールマシンの
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe"
または
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe"
をテスト環境で実行し、改めて4つのファイルだけをコピーしたところで動くかどうかを確認してみてください。


引用返信 編集キー/
■66102 / inTopicNo.3)  Re[1]: 64bitOS上でexeが動作しない件について
□投稿者/ オショウ (71回)-(2013/04/01(Mon) 19:34:40)
> お手数ですが、宜しくお願い致します。

  動作PCの方で、DependencyWalker 使って、不足している何かが無いか
  調べた方がよいのでは?

  ttp://www.dependencywalker.com/

  x86と記載されているので、32bit版の方がよいかも。

以上。
引用返信 編集キー/
■66103 / inTopicNo.4)  Re[2]: 64bitOS上でexeが動作しない件について
□投稿者/ howling (319回)-(2013/04/01(Mon) 20:44:56)
No66101 (とっちゃん さん) に返信
> テスト環境のPCにて、新しくフォルダを用意し、これら4つの出力ファイルだけがある状態にして
> EXEをエクスプローラでダブルクリックしてみてください。

ちょっとやってみます。
それ以外に必要なDLLも含めて、ということですよね?
ロード時に必要なリソース関連は、入れないで動かしても同様のエラーが出るはず、と。
ひとまずやってみます。

引用返信 編集キー/
■66104 / inTopicNo.5)  Re[2]: 64bitOS上でexeが動作しない件について
□投稿者/ howling (320回)-(2013/04/01(Mon) 20:56:21)
No66102 (オショウ さん) に返信

ご返信ありがとうございます。
すみません、書いておけばよかったですね…。

DependencyWalkerを使って、必要なDLL自体は見える範囲ではOK、ということは確認しています。
(赤いアイコンが無い状態)

ただ、エラーが出てまして、こちらには

Error: 暗黙の依存モジュールに間違ったエクスポートがあるため、未解決のインポートが1つ以上あります
Error: CPUタイプの異なるモジュールが見つかりました

と出ています。

Warningも出ていて、

1つ以上の遅延ロード依存モジュールが見つかりませんでした
1つ以上のモジュールで遅延ロードモジュールのエクスポート関数の間違いで解決できないインポートがあります

と表示されています。

…この未解決ってどーしたらええねん!って思って止まってしまっている状態です。
引用返信 編集キー/
■66105 / inTopicNo.6)  Re[3]: 64bitOS上でexeが動作しない件について
□投稿者/ とっちゃん (95回)-(2013/04/01(Mon) 20:56:31)
とっちゃん さんの Web サイト
No66103 (howling さん) に返信
> ■No66101 (とっちゃん さん) に返信
>>テスト環境のPCにて、新しくフォルダを用意し、これら4つの出力ファイルだけがある状態にして
>>EXEをエクスプローラでダブルクリックしてみてください。
>
> ちょっとやってみます。
> それ以外に必要なDLLも含めて、ということですよね?

いえ。ほかに必要なDLLがあってもとりあえずそれはコピーする必要はありません。
4つの出力ファイルだけって書いてるでしょ?
DLLが見つからないというエラーは 0xc000007b ではありません。

参考に...
http://blogs.wankuma.com/tocchann/archive/2008/03/14/127679.aspx


> ロード時に必要なリソース関連は、入れないで動かしても同様のエラーが出るはず、と。
> ひとまずやってみます。
>
すでに状況はトラブルシュートです。

まず必要なのは、問題の切り分けです。
そのためには最小限の状態まで絞り込んでエラーがあるかどうかを調べるのが一番なのです。

付随して必要なDLLがあったとして(聞いてないですけどね)、それらを追加してしまったら
プロジェクトの設定が間違ってるのかそうではないのかが切り分けられません。

引用返信 編集キー/
■66106 / inTopicNo.7)  Re[4]: 64bitOS上でexeが動作しない件について
□投稿者/ howling (321回)-(2013/04/01(Mon) 21:21:09)
No66105 (とっちゃん さん) に返信

> いえ。ほかに必要なDLLがあってもとりあえずそれはコピーする必要はありません。
> 4つの出力ファイルだけって書いてるでしょ?
> DLLが見つからないというエラーは 0xc000007b ではありません。

やってみました。(というか最初はそういえばそうやっていました…)

「MSVCR100D.dllが無いため〜」と出ます。

そして、これを書いて大事なことを思い出しました。
これ、Releaseビルドではなく、Debugビルドなのです。
Releaseで動けばそれが一番良いのですが、
これは私の部分ではないところで、動いてくれていないのが現状です…。

で、確かその次に出るのがMSVCP100D.dllだったと思います。
動作環境にそれを上記の2つも突っ込んだ状態で、以前は動かしていました。

…質問に必要な情報が足りてませんね…お手数おかけして申し訳ございません。
引用返信 編集キー/
■66107 / inTopicNo.8)  Re[5]: 64bitOS上でexeが動作しない件について
□投稿者/ howling (322回)-(2013/04/01(Mon) 21:32:27)
追記です。

先程の2つのDLL(MSVCP100d.DLL&MSVCR100d.DLL)のみ追加して実行したところ、
元のエラー(0xc000007b)が出ることを確認しました。

やはりx64とx86の混在なのでしょうか…。

引用返信 編集キー/
■66108 / inTopicNo.9)  Re[6]: 64bitOS上でexeが動作しない件について
□投稿者/ とっちゃん (96回)-(2013/04/01(Mon) 21:51:03)
とっちゃん さんの Web サイト
No66107 (howling さん) に返信
> 追記です。
>
> 先程の2つのDLL(MSVCP100d.DLL&MSVCR100d.DLL)のみ追加して実行したところ、
> 元のエラー(0xc000007b)が出ることを確認しました。
>
コピーしてくる前は、出なかったエラーが、コピーしてきたことで発生したのですよね?
原因が判明しましたね。

原因はMSVCP100D.DLL と MSVCR100D.DLL の誤ったイメージをコピーしてきたところにあります。

VSのインストール先
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86
または
C:\Program Files\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86

から、要求されたDLLをコピーしてください。
それでたぶん解決すると思います。

が、それ以前の問題として
>これは私の部分ではないところで、動いてくれていないのが現状です…。


こっちを先に修正する必要があります。
デバッグランタイムは、テストのために一時的にVSインストール環境外にコピーすることは認められていますが
アプリケーションを常用するためにコピーすることは認められていません。


> やはりx64とx86の混在なのでしょうか…。
>
コピーしてきた結果、0xC000007B が発生したのであれば、混在が原因でしょう。
ただし、プロジェクトの設定が間違っているのではなく、コピーしてくるものが間違っているという理由ですが。

引用返信 編集キー/
■66109 / inTopicNo.10)  Re[7]: 64bitOS上でexeが動作しない件について
□投稿者/ howling (323回)-(2013/04/01(Mon) 22:13:15)
No66108 (とっちゃん さん) に返信

ご返信頂きありがとうございます。

> コピーしてくる前は、出なかったエラーが、コピーしてきたことで発生したのですよね?
> 原因が判明しましたね。
>
> 原因はMSVCP100D.DLL と MSVCR100D.DLL の誤ったイメージをコピーしてきたところにあります。
>
> VSのインストール先
> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86
> または
> C:\Program Files\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86
>
> から、要求されたDLLをコピーしてください。
> それでたぶん解決すると思います。

…エラー内容が変わりました…!
他に必要なDLLファイルがいくつかあるのですが、それが無いというエラーに。
…元動かしていたフォルダにコピペしたら動きました…。
いや…もうなんとお礼を言ったら良いかわかりません。
本当に助かりました。ありがとうございました。

今回のこの件なのですが、
これに対してはこのDLLが必要、という細かいバージョン指定があるということですよね?

今回は

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC100.DebugCRT

こちらを使用しましたが、NonRedistというのが何に対する言葉なのかいまいちわかっていませんので
MSDNあさってみます。

> こっちを先に修正する必要があります。
> デバッグランタイムは、テストのために一時的にVSインストール環境外にコピーすることは認められていますが
> アプリケーションを常用するためにコピーすることは認められていません。

全くおっしゃる通りです。
ひとまず明日、Releaseで動かないこと自体は上司も知っていること(というのも問題ですが)ですので、相談してみます。
引き継ぎなので、本当は立つ鳥後を濁さないようにしたいので…。

> コピーしてきた結果、0xC000007B が発生したのであれば、混在が原因でしょう。
> ただし、プロジェクトの設定が間違っているのではなく、コピーしてくるものが間違っているという理由ですが。

うーん、ということは、あの時点でエラーが出なかったとして、1つ1つDLLを持っていって、どこでエラーが出るか?
というのを調べていけば良かったということですよね?

いや…今後こういったエラーが出た時に、同じように対応できるかどうか正直自信がないのですが、
せめて同じようなエラーへの対処法は学んでおければと思います。

ひとまず、おかげさまで解決しました。
とっちゃんさんをはじめ、回答してくださった多くの方々、本当にありがとうございました!
大切なお時間を使わせてしまって申し訳ありませんでした。
解決済み
引用返信 編集キー/
■66111 / inTopicNo.11)  Re[8]: 64bitOS上でexeが動作しない件について
□投稿者/ 魔界の仮面弁士 (187回)-(2013/04/02(Tue) 02:15:49)
No66109 (howling さん) に返信
> 今回は
> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC100.DebugCRT
> こちらを使用しましたが、NonRedistというのが何に対する言葉なのかいまいちわかっていませんので
> MSDNあさってみます。

redist とは「再頒布」のこと。すなわち Debug_NonRedist とは、
「デバッグ用の再頒布してはならないライブラリ」を指しているものかと。

http://msdn.microsoft.com/ja-jp/library/aa985618%28vs.100%29.aspx
解決済み
引用返信 編集キー/
■66113 / inTopicNo.12)  Re[9]: 64bitOS上でexeが動作しない件について
□投稿者/ howling (325回)-(2013/04/02(Tue) 10:40:24)
No66111 (魔界の仮面弁士 さん) に返信

ご返信ありがとうございます。
なるほど、redistributeのredistなんですね…。
確かに再頒布するべき物ではないと思いますし、そもそもReleaseビルドで動作するようにすべきですね。
また何か関連のことで疑問点が解決しなかった場合に、こちらに書きこむこともあるかと思いますが、その折はしくお願い致します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -