Share via


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

読み込みに. /C C/C++ アプリケーションが依存するライブラリが見つからない場合は、失敗する場合があります。ここでは、/C. C/C++ アプリケーションが読み込まれない理由を説明する問題を解決するための手順を提案します。一般的な理由が。

実行可能ファイルと同じフォルダーに %WINDIR%\WinSxS\フォルダーのネイティブ アセンブリ キャッシュのプライベート アセンブリとして隣り合わせのアセンブリへの依存関係、およびアセンブリを指定するマニフェストがインストールされているため、アプリケーションが読み込むと、次のエラー メッセージの 1 つが、アプリケーションを実行してみて Windows のバージョンによって、表示されることがあります。

  • アプリケーション正しく初期化 (0xc0000135)。

  • アプリケーション構成が正しくないため、このアプリケーションの開始に失敗しました。アプリケーションの再インストールをすることで、この問題が解決する可能性があります。

  • システムは、指定されたプログラムを実行できません。

アプリケーション マニフェストにはなく、Windows が一般的な検索の位置で見つけることができない DLL に依存しているようなエラー メッセージは、この 1 表示可能性があります:

  • このアプリケーションは起動されていません 必要な DLL が見つからないためです。アプリケーションをインストールし直すとこの問題は解決される場合があります。

アプリケーションで Visual Studio を、インストールされていないコンピューターで前の物のようなエラー メッセージと、クラッシュ配置されている場合は、次の点をチェックする:

  1. Visual C++ アプリケーションの依存関係の理解で説明されている手順に従います。依存関係の一つは、アプリケーションまたは DLL のほとんどの依存関係を表示できます。いない DLL があることを確認する場合は、アプリケーションを実行しているコンピューターにインストールします。

  2. オペレーティング システム ローダーは、アプリケーションが依存するアセンブリを読み込むためにアプリケーション マニフェストを使用します。マニフェスト リソースとしては、binary に埋め込むか、アプリケーション フォルダーの個別のファイルとしてインストールできます。マニフェストが binary に埋め込まれているかどうかを確認するには、Visual Studio の binary を開き、リソースの一覧の RT_MANIFEST を検索します。埋め込みマニフェストが見つからない場合は、<binary_name>のようなものという名前のファイルをアプリケーション フォルダーを参照します。<extension>.manifest。

  3. アプリケーションが隣り合わせのアセンブリに依存している場合、マニフェストが存在しない場合は、リンカーがプロジェクトのマニフェストを生成することを確認する必要があります。プロジェクトの [プロジェクトのプロパティ] のダイアログ ボックスのリンカー オプション [マニフェストの生成] をチェックします。

  4. マニフェストが binary に埋め込まれている場合、RT_MANIFEST の ID が binary のこの型に対して正しいことを確認します。使用するリソース id が確認 隣り合わせのアセンブリをリソース (Windows) として使用します詳細については。マニフェストが別のファイルにある場合は、テキスト エディターまたは XML エディターで開きます。配置のマニフェストと規則の詳細については、[マニフェスト]を参照してください。

    [!メモ]

    埋め込みマニフェストと他のマニフェスト ファイルの両方が存在する場合、オペレーティング システム ローダーは埋め込みマニフェストを使用し、別のファイルは無視されます。ただし、Windows XP に、オブジェクトは本当の他のマニフェスト ファイルで使用されます、埋め込みマニフェストは無視されます。

  5. また、DLL が LoadLibrary の呼び出しで読み込まれる場合、外部マニフェストは無視されるため、DLL のマニフェストを埋め込むことをお勧めします。詳細については、「アセンブリ マニフェスト」を参照してください。

  6. マニフェストに列挙されているすべてのアセンブリがコンピューターに正しくインストールされていることを確認します。各アセンブリは、名前、バージョン番号、およびプロセッサ アーキテクチャでマニフェストに指定されます。アプリケーションが隣り合わせのアセンブリに依存している場合、オペレーティング システム ローダーがそれらを見つけることができるように、これらのアセンブリがコンピューターに シーケンスを検索しているアセンブリに説明されているように、正しくインストールされていることを確認します。64 ビット アセンブリは、32 ビット プロセスで読み込んだり、32 ビット オペレーティング システムで実行したりできないことに注意してください。

次に、アプリケーション Visual C++を使用してビルドされた appl.exe があるとします。アプリケーション マニフェストは 1 と同じ ID を持つ埋め込まれましたりまたは個々のファイル appl.exe.manifest として格納されますバイナリ リソース RT_MANIFEST として appl.exe のいずれか。このマニフェストの内容は次のようになります。:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

オペレーティング システム ローダーは、このマニフェストは、appl.exe が Fabrikam.SxS.Library の 32 ビットの x86 プロセッサ アーキテクチャ用にビルドされたバージョン 2.0.20121.0 という名前のアセンブリに依存していることを通知します。依存の隣り合わせのアセンブリは、共有アセンブリまたはプライベート アセンブリとしてインストールできます。

共有アセンブリのアセンブリ マニフェストは %WINDIR%\WinSxS\Manifests\フォルダーにインストールされます。これは、目次するアセンブリを識別し、アセンブリの一部に含まれる DLL:示します

<?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="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
   <file name="Fabrikam.Main.dll" hash="3ca5156e8212449db6c622c3d10f37d9adb1ab12" hashalg="SHA1"/>
   <file name="Fabrikam.Helper.dll" hash="92cf8a9bb066aea821d324ca4695c69e55b2d1c2" hashalg="SHA1"/>
</assembly>

同じアセンブリの別のバージョンの代わりに隣り合わせのアセンブリの 1 種類のバージョンを使用する隣り合わせのアセンブリもようにグローバルにリダイレクトのアプリケーションとアセンブリ ポリシー ファイルに、既知の [publisher configuration files]—を使用できます。%WINDIR%\WinSxS\Policies\フォルダーの共有アセンブリのポリシーをチェックできます。ポリシー ファイルの例を次に示します。:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32-policy" name="policy.2.0.Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
         <bindingRedirect oldVersion="2.0.10000.0-2.0.20120.99" newVersion="2.0.20121.0"/>
      </dependentAssembly>
   </dependency>
</assembly>

このポリシー ファイルはアセンブリのバージョン 2.0.10000.0 を求めるアプリケーションまたはアセンブリが、システムに現在インストールされているのバージョンであるバージョン 2.0.20121.0 を使用する必要があることを指定します。アプリケーション マニフェストで示されたアセンブリのバージョンがポリシー ファイルで指定されている場合、ローダーはこのバージョンがインストール %WINDIR%\WinSxS\フォルダーのマニフェストで指定されている、読み込みは失敗します。このアセンブリのバージョンを検索します。およびアセンブリのバージョンがインストール 2.0.20121.0、読み込みはアセンブリのバージョン 2.0.10000.0 を要求するアプリケーションのために失敗します。

ただし、アセンブリは、アプリケーションのインストール フォルダーの隣り合わせプライベート アセンブリとしてインストールできます。オペレーティング システムが共有アセンブリとしてアセンブリを検索、次の順序でプライベート アセンブリとしてファイルを検索します:

  1. 名前 <assemblyName>.manifest というマニフェスト ファイルのアプリケーション フォルダーをチェックします。この例では、ローダーは appl.exe を含むフォルダーの Fabrikam.SxS.Library.manifest を検索します。マニフェストが見つからない場合は、ローダーはアプリケーション フォルダーからアセンブリを読み込みます。アセンブリが見つからない場合、読み込みは失敗します。

  2. \の<assemblyName>の\がある場合は、appl.exe を含む、このフォルダーの名前 <assemblyName>.manifest というマニフェスト ファイルの読み込みフォルダーの\の<assemblyName>の\フォルダーを開こうとした。マニフェストが見つからない場合、ローダーは\の<assemblyName>の\フォルダーからアセンブリを読み込みます。アセンブリが見つからない場合、読み込みは失敗します。

詳細については、ローダーは、依存アセンブリについて検索、シーケンスを検索しているアセンブリを参照してください。ローダーがプライベート アセンブリとして、依存アセンブリを検索失敗した場合、読み込みメッセージが "システム" 指定されたプログラムを実行できない表示されます。一部のある依存アセンブリと DLL をプライベートまたは共有アセンブリとしてコンピューターにインストールされていることを、このエラーを解決するには、確認します。

参照

概念

分離アプリケーションおよび side-by-side アセンブリの概念

その他の技術情報

C/C++ 分離アプリケーションおよび side-by-side アセンブリのビルド