VC8(Visual Studio 2005) でコンパイルしたバイナリを VC がインストールされていない環境で実行できない


232,517

Yesterday: 23 Today: 6

connected: via IPv4

VC8(Visual Studio 2005) でコンパイルしたバイナリを VC がインストールされていない環境で実行できない

注意:
beta 2 から製品版になって実行ファイルが存在する場所にランタイムがあってもロード時にエラーになるようになりました。
side-by-side 形式の VC8 ランタイムが実行環境にインストールされている必要があります。

VC8 ランタイムのダウンロード先

2007-04-22 現在

x86 版:
Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86) ver 8.0.50727.762 2007-04-10 @Microsoft.com

x64 版:
Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x64) ver 8.0.50727.762 2007-04-10 @Microsoft.com

IA64 版:
Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (IA64) ver 8.0.50727.762 2007-04-10 @Microsoft.com

2006-06-30 現在

x86 版:
Microsoft Visual C++ 2005 再頒布可能パッケージ (x86) ver 1.0 2006-04-10 @Microsoft.com

x64 版:
Microsoft Visual C++ 2005 再頒布可能パッケージ (x64) ver 1.0 2006-04-10 @Microsoft.com

IA64 版:
Microsoft Visual C++ 2005 再頒布可能パッケージ (IA64) ver 1.0 2006-04-06 @Microsoft.com

厳密には manifest なしでは正常動作しないように変更されたようです。 ビルド環境で使用しているランタイムのバージョンと実行環境で使用しているランタイムのバージョンの違いから 挙動がおかしくなることが発生していたようなので .NET Framework で行っていた side-by-side を義務付けたように感じます。


症状

VC8 で作成したバイナリを実行すると「ms*.dll が見つからないため、このアプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決される場合があります。」 とダイアログが表示されて実行できない。

リモートデバッグ上に「デバッガ:: ハンドルされていない続行不可の STATUS_DLL_NOT_FOUND 例外がプロセスの読み込み中にスローされました」の行が表示される

対処

VC8 のランタイムが実行環境にインストールされていないのでインストールしてください。

今までのように実行ファイルと同じところに DLL だけを置いたとしてもランタイムエラーが発生するだけなので絶対に行わないでください。


症状

VC8 (Visual Studio 2005) で作成したバイナリを実行すると「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」 とダイアログが表示されて実行できない。

リモートデバッグ上では「このアプリケーションの構成が正しくないため、アプリケーションの開始に失敗しました。マニフェストファイルを参照して原因を調べてください。アプリケーションを再インストールすることで、この問題が解決する可能性があります。...」 とダイアログが表示されて実行できない。

対処

VC8 のランタイムを実行環境にインストールしていない場合はインストールしてください。

VC8 beta2 で回避できていた VC8 でプロジェクトのオプションに「リンカオプション」=>「マニフェスト ファイル」の以下の項目を変更してリビルドしてはいけません

     マニフェストの作成:はい => いいえ X
     マニフェストの作成:いいえ => はい ○
    

実行させるとデバッグランタイムではランタイムエラー R6034 が表示されマニフェストを使用するようにしてアプリケーションをビルドするように警告が表示されます。
リリースランタイムではランタイムエラー R6034 が表示されアプリケーションのサポートチームに連絡してくださいと警告が出て「0xC0000142: DLL Initialization Failed」例外が発生します。

対処

Win32-x64 実行形式から Win32-x86 の DLL をロードしようとしていないか確認してください。(逆の場合もだめです。) 特に MSVCRT.DLL, msvcp60.dll などが問題になります。

Win32-x64 実行形式の場合は LoadLibrary でファイルを検索するパスすべてに実行形式と一致しない形式 (Win32-x86) の DLL が転がっていないか確認してください。

実行ファイルと同じ場所に Win32-x86 の DLL をおいていないか?
    
環境変数「PATH」に Win32-x86 の DLL が入っているパスが含まれていないか?
    
システムディレクトリ、Windows ディレクトリなどなど
    

Win32-x64 から Win32-x86 の DLL が読み込めないのが原因です。(Win32-x86 から Win32-x64 も読み込めません。)
Dependency Walker を使用すると混合している場合は混合している DLL が赤く表示されます。


症状

Microsoft が配布している VC8 再配布可能パッケージではデバッグ版が含まれていないため、デバッグ版でビルドした場合に実行できない

対処

実行形式ファイルと同じところに「Microsoft.VC80.DebugCRT.manifest」、「Microsoft.VC80.DebugMFC.manifest」ファイルを作成してください。
開発用途としてのみ使用してください。デバッグランタイムは再配布禁止です。
ATL, OpenMP などを使用している場合は WinSxS フォルダを参考にして manifest を作成してください。

記入する内容は、標準では 「$(IntDir)\$(TargetFileName).intermediate.manifest」となっているファイルに記載されている内容を元に修正してください。

「Microsoft.VC80.DebugCRT.manifest」
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity 
        type='win32' 
        name='Microsoft.VC80.DebugCRT' 
        version='8.0.XXXXX.X' 
        processorArchitecture='XXXXX' 
        publicKeyToken='XXXXXXXXXXXXXXXX'
    />
    <file name="msvcr80d.dll"/>
    <file name="msvcp80d.dll"/>
    <file name="msvcm80d.dll"/>
</assembly>
    
「Microsoft.VC80.DebugMFC.manifest」
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity 
        type='win32' 
        name='Microsoft.VC80.DebugMFC' 
        version='8.0.XXXXX.X' 
        processorArchitecture='XXXXX' 
        publicKeyToken='XXXXXXXXXXXXXXXX'
    />
    <file name="mfc80d.dll"/>
    <file name="mfc80ud.dll"/>
    <file name="mfcm80d.dll"/>
    <file name="mfcm80ud.dll"/>
</assembly>
    

このやり方を応用すれば今までのように VC8 のランタイムをインストールせずに実行ファイルと同じところに DLL をおくことが可能になります。

参照: C/C++ 分離アプリケーションおよび side-by-side アセンブリのトラブルシューティング @ Microsoft



last update at 2010/11/09 19:17:07