Pemecahan Masalah Aplikasi Terisolasi C/C++ dan Rakitan Berdampingan

Memuat aplikasi C/C++ dapat gagal jika pustaka dependen tidak dapat ditemukan. Artikel ini menjelaskan beberapa alasan umum mengapa aplikasi C/C++ gagal dimuat, dan menyarankan langkah-langkah untuk mengatasi masalah.

Jika aplikasi gagal dimuat karena memiliki manifes yang menentukan dependensi pada rakitan berdampingan, dan rakitan tidak diinstal sebagai rakitan privat di folder yang sama dengan yang dapat dieksekusi atau di cache rakitan asli di folder %WINDIR%\WinSxS\, salah satu pesan kesalahan berikut mungkin ditampilkan, tergantung pada versi Windows tempat Anda mencoba menjalankan aplikasi.

  • Aplikasi gagal menginisialisasi dengan benar (0xc0000135).

  • Aplikasi ini gagal dimulai karena konfigurasi aplikasi salah. Menginstal ulang aplikasi dapat memperbaiki masalah ini.

  • Sistem tidak dapat menjalankan program yang ditentukan.

Jika aplikasi Anda tidak memiliki manifes dan bergantung pada DLL yang tidak dapat ditemukan Windows di lokasi pencarian umum, pesan kesalahan yang menyerupai yang satu ini mungkin ditampilkan:

  • Aplikasi ini gagal dimulai karena DLL yang diperlukan tidak ditemukan. Menginstal ulang aplikasi dapat memperbaiki masalah ini.

Jika aplikasi Anda disebarkan di komputer yang tidak memiliki Visual Studio, dan mengalami crash dengan pesan kesalahan yang menyerupai yang sebelumnya, periksa hal-hal berikut:

  1. Ikuti langkah-langkah yang dijelaskan dalam Memahami Dependensi Aplikasi Visual C++. Walker dependensi dapat menunjukkan sebagian besar dependensi untuk aplikasi atau DLL. Jika Anda mengamati bahwa beberapa DLL hilang, instal di komputer tempat Anda mencoba menjalankan aplikasi Anda.

  2. Loader sistem operasi menggunakan manifes aplikasi untuk memuat rakitan yang bergantung pada aplikasi. Manifes dapat disematkan dalam biner sebagai sumber daya, atau diinstal sebagai file terpisah di folder aplikasi. Untuk memeriksa apakah manifes disematkan dalam biner, buka biner di Visual Studio dan cari RT_MANIFEST dalam daftar sumber dayanya. Jika Anda tidak dapat menemukan manifes yang disematkan, lihat di folder aplikasi untuk file yang diberi nama seperti <binary_name>.<extension.manifest>.

  3. Jika aplikasi Anda bergantung pada rakitan berdampingan dan manifes tidak ada, Anda harus memastikan bahwa linker menghasilkan manifes untuk proyek Anda. Centang opsi linker Hasilkan manifes dalam kotak dialog Properti Proyek untuk proyek.

  4. Jika manifes disematkan dalam biner, pastikan bahwa ID RT_MANIFEST sudah benar untuk jenis biner ini. Untuk informasi selengkapnya tentang ID sumber daya mana yang akan digunakan, lihat Menggunakan Rakitan Berdampingan sebagai Sumber Daya (Windows). Jika manifes berada dalam file terpisah, buka di editor XML atau editor teks. Untuk informasi selengkapnya tentang manifes dan aturan untuk penyebaran, lihat Manifes.

    Catatan

    Jika manifes yang disematkan dan file manifes terpisah ada, loader sistem operasi menggunakan manifes yang disematkan dan mengabaikan file terpisah. Namun, pada Windows XP, sebaliknya adalah true—file manifes terpisah digunakan dan manifes yang disematkan diabaikan.

  5. Kami menyarankan agar Anda menyematkan manifes di setiap DLL karena manifes eksternal diabaikan saat DLL dimuat melalui LoadLibrary panggilan. Untuk informasi selengkapnya, lihat Manifes perakitan.

  6. Periksa apakah semua rakitan yang dijumlahkan dalam manifes diinstal dengan benar di komputer. Setiap rakitan ditentukan dalam manifes berdasarkan nama, nomor versi, dan arsitektur prosesornya. Jika aplikasi Anda bergantung pada rakitan berdampingan, periksa apakah rakitan ini diinstal dengan benar di komputer sehingga pemuat sistem operasi dapat menemukannya, seperti yang dijelaskan dalam Urutan Pencarian Perakitan. Ingatlah bahwa rakitan 64-bit tidak dapat dimuat dalam proses 32-bit dan tidak dapat dijalankan pada sistem operasi 32-bit.

Contoh

Asumsikan kita memiliki aplikasi, appl.exe, yang dibangun dengan menggunakan Visual C++. Manifes aplikasi disematkan di appl.exe sebagai sumber daya biner RT_MANIFEST, yang memiliki ID sama dengan 1, atau disimpan sebagai file terpisah appl.exe.manifest. Konten manifes ini menyerupai ini:

<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>

Untuk pemuat sistem operasi, manifes ini mengatakan bahwa appl.exe bergantung pada rakitan bernama Fabrikam.SxS.Library, versi 2.0.20121.0, yang dibangun untuk arsitektur prosesor x86 32-bit. Rakitan berdampingan dependen dapat diinstal baik sebagai rakitan bersama atau sebagai rakitan privat.

Manifes perakitan untuk rakitan bersama diinstal di folder %WINDIR%\WinSxS\Manifests\. Ini mengidentifikasi rakitan dan mencantumkan kontennya—yaitu, DLL yang merupakan bagian dari rakitan:

<?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>

Rakitan berdampingan juga dapat menggunakan file konfigurasi penerbit—juga dikenal sebagai file kebijakan—untuk mengalihkan aplikasi dan rakitan secara global untuk menggunakan satu versi rakitan berdampingan alih-alih versi lain dari rakitan yang sama. Anda dapat memeriksa kebijakan untuk rakitan bersama di folder %WINDIR%\WinSxS\Policies\. Berikut adalah contoh file kebijakan:

<?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>

File kebijakan ini menentukan bahwa aplikasi atau rakitan apa pun yang meminta versi 2.0.10000.0 dari rakitan ini harus menggunakan versi 2.0.20121.0, yang merupakan versi saat ini yang diinstal pada sistem. Jika versi rakitan yang disebutkan dalam manifes aplikasi ditentukan dalam file kebijakan, loader mencari versi rakitan ini yang ditentukan dalam manifes di folder %WINDIR%\WinSxS\, dan jika versi ini tidak diinstal, pemuatan gagal. Dan jika rakitan versi 2.0.20121.0 tidak diinstal, pemuatan gagal untuk aplikasi yang meminta rakitan versi 2.0.10000.0.

Namun, rakitan juga dapat diinstal sebagai rakitan berdampingan privat di folder aplikasi yang diinstal. Jika sistem operasi gagal menemukan rakitan sebagai rakitan bersama, sistem operasi akan mencarinya sebagai rakitan privat, dalam urutan berikut:

  1. Periksa folder aplikasi untuk file manifes yang memiliki nama <assemblyName.manifest>. Dalam contoh ini, loader mencoba menemukan Fabrikam.SxS.Library.manifest di folder yang berisi appl.exe. Jika menemukan manifes, loader memuat rakitan dari folder aplikasi. Jika rakitan tidak ditemukan, pemuatan gagal.

  2. Coba buka folder \<assemblyName>\ di folder yang berisi appl.exe, dan jika \<assemblyName>\ ada, coba muat file manifes yang memiliki nama <assemblyName.manifest> dari folder ini. Jika manifes ditemukan, loader memuat rakitan dari folder \<assemblyName>\. Jika rakitan tidak ditemukan, pemuatan gagal.

Untuk informasi selengkapnya tentang cara loader mencari rakitan dependen, lihat Urutan Pencarian Perakitan. Jika loader gagal menemukan rakitan dependen sebagai rakitan privat, pemuatan gagal dan pesan "Sistem tidak dapat menjalankan program yang ditentukan" ditampilkan. Untuk mengatasi kesalahan ini, pastikan rakitan dependen—dan DLL yang merupakan bagian darinya—diinstal di komputer sebagai rakitan privat atau bersama.

Baca juga

Konsep Aplikasi Terisolasi dan Rakitan Berdampingan
Membangun Aplikasi Terisolasi C/C++ dan Rakitan Berdampingan