Aracılığıyla paylaş


C/C++ Yalıtılmış Uygulamalar ve Yan Yana Derlemeler ile İlgili Sorunları Giderme

Bağımlı kitaplıklar bulunamazsa C/C++ uygulamasını yükleme işlemi başarısız olabilir. Bu makalede, bir C/C++ uygulamasının yüklenememesinin bazı yaygın nedenleri açıklanır ve sorunları çözmek için adımlar önerilir.

Bir uygulama yan yana derlemede bağımlılığı belirten bir bildirime sahip olduğu için yüklenemezse ve derleme yürütülebilir dosyayla aynı klasöre veya %WINDIR%\WinSxS\ klasöründeki yerel derleme önbelleğine özel derleme olarak yüklenmediyse, aşağıdaki hata iletilerinden biri görüntülenebilir, uygulamasını çalıştırmaya çalıştığınız Windows sürümüne bağlı olarak.

  • Uygulama düzgün başlatılamadı (0xc0000135).

  • Uygulama yapılandırması yanlış olduğundan bu uygulama başlatılamadı. Uygulamayı yeniden yüklemek bu sorunu çözebilir.

  • Sistem belirtilen programı yürütemiyor.

Uygulamanızın bildirimi yoksa ve Windows'un tipik arama konumlarında bulabildiği bir DLL'ye bağlıysa, buna benzer bir hata iletisi görüntülenebilir:

  • Gerekli bir DLL bulunamadığından bu uygulama başlatılamadı. Uygulamayı yeniden yüklemek bu sorunu çözebilir.

Uygulamanız Visual Studio'suna sahip olmayan bir bilgisayara dağıtıldıysa ve öncekine benzer hata iletileriyle kilitleniyorsa, şunları denetleyin:

  1. Visual C++ Uygulamasının Bağımlılıklarını Anlama başlığında açıklanan adımları izleyin. Bağımlılık yürütücüsü, bir uygulama veya DLL için bağımlılıkların çoğunu gösterebilir. Bazı DLL'lerin eksik olduğunu gözlemlerseniz, bunları uygulamanızı çalıştırmaya çalıştığınız bilgisayara yükleyin.

  2. İşletim sistemi yükleyicisi, uygulamanın bağımlı olduğu derlemeleri yüklemek için uygulama bildirimini kullanır. Bildirim, ikili dosyaya kaynak olarak eklenebilir veya uygulama klasörüne ayrı bir dosya olarak yüklenebilir. Bildirimin ikili dosyaya eklenip eklenmediğini denetlemek için, ikiliyi Visual Studio'da açın ve kaynak listesinde RT_MANIFEST arayın. Eklenmiş bir bildirim bulamazsanız, uygulama klasöründe binary_name> gibi <bir adla adlandırılan bir dosya bulun.<extension.manifest>.

  3. Uygulamanız yan yana derlemelere bağımlıysa ve bir bildirim yoksa bağlayıcının projeniz için bir bildirim oluşturduğundan emin olmanız gerekir. Projenin Proje Özellikleri iletişim kutusunda Bildirim oluştur bağlayıcı seçeneğini işaretleyin.

  4. Bildirim ikili dosyaya eklenmişse, bu tür ikili için RT_MANIFEST kimliğinin doğru olduğundan emin olun. Hangi kaynak kimliğinin kullanılacağı hakkında daha fazla bilgi için bkz. Yan Yana Derlemeleri Kaynak Olarak Kullanma (Windows). Bildirim ayrı bir dosyadaysa, bir XML düzenleyicisinde veya metin düzenleyicisinde açın. Dağıtım bildirimleri ve kuralları hakkında daha fazla bilgi için bkz . Bildirimler.

    Dekont

    Hem eklenmiş bir bildirim hem de ayrı bir bildirim dosyası varsa, işletim sistemi yükleyicisi eklenmiş bildirimi kullanır ve ayrı dosyayı yoksayar. Ancak Windows XP'de bunun tersi doğrudur; ayrı bildirim dosyası kullanılır ve eklenmiş bildirim yoksayılır.

  5. Bir DLL çağrıya rağmen yüklendiğinde dış bildirimler yoksayıldığından, her DLL'ye bir LoadLibrary bildirim eklemenizi öneririz. Daha fazla bilgi için bkz . Derleme bildirimleri.

  6. Bildirimde numaralandırılmış tüm derlemelerin bilgisayara doğru yüklenip yüklenmediğini denetleyin. Her derleme bildirimde adı, sürüm numarası ve işlemci mimarisine göre belirtilir. Uygulamanız yan yana derlemelere bağımlıysa, işletim sistemi yükleyicisinin Derleme Arama Sırası'nda açıklandığı gibi bunları bulabilmesi için bu derlemelerin bilgisayara doğru şekilde yüklenip yüklenmediğini denetleyin. 64 bit derlemelerin 32 bit işlemlerde yüklenemeyeceğini ve 32 bit işletim sistemlerinde yürütülemeyeceğini unutmayın.

Örnek

Visual C++ kullanılarak oluşturulmuş appl.exe bir uygulamamız olduğunu varsayalım. Uygulama bildirimi appl.exe dosyasına, kimliği 1'e eşit olan ikili kaynak RT_MANIFEST olarak eklenir veya ayrı appl.exe.manifest dosyası olarak depolanır. Bu bildirimin içeriği şuna benzer:

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

İşletim sistemi yükleyicisinde, bu bildirim appl.exe dosyasının 32 bit x86 işlemci mimarisi için oluşturulmuş Fabrikam.SxS.Library, sürüm 2.0.20121.0 adlı bir derlemeye bağlı olduğunu belirtir. Bağımlı yan yana derleme, paylaşılan derleme olarak veya özel bir derleme olarak yüklenebilir.

Paylaşılan derlemenin derleme bildirimi %WINDIR%\WinSxS\Manifests\ klasörüne yüklenir. Derlemeyi tanımlar ve içeriğini listeler; diğer bir deyişle derlemenin parçası olan DLL'ler:

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

Yan yana derlemeler, uygulamaları ve derlemeleri aynı derlemenin başka bir sürümü yerine yan yana derlemenin bir sürümünü kullanacak şekilde genel olarak yeniden yönlendirmek için, ilke dosyaları olarak da bilinen yayımcı yapılandırma dosyalarını da kullanabilir. %WINDIR%\WinSxS\Policies\ klasöründe paylaşılan derlemenin ilkelerini de kontrol edebilirsiniz. Örnek bir ilke dosyası aşağıda verilmiştir:

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

Bu ilke dosyası, bu derlemenin 2.0.10000.0 sürümünü soran tüm uygulama veya derlemelerin bunun yerine sistemde yüklü olan geçerli sürüm olan 2.0.20121.0 sürümünü kullanması gerektiğini belirtir. Uygulama bildiriminde belirtilen derlemenin bir sürümü ilke dosyasında belirtilirse, yükleyici %WINDIR%\WinSxS\ klasöründeki bildirimde belirtilen bu derlemenin bir sürümünü arar ve bu sürüm yüklü değilse yük başarısız olur. Derleme sürümü 2.0.20121.0 yüklü değilse, derleme sürümü 2.0.10000.0'ı soran uygulamalar için yük başarısız olur.

Ancak, derleme, yüklenen uygulama klasörüne özel bir yan yana derleme olarak da yüklenebilir. İşletim sistemi derlemeyi paylaşılan derleme olarak bulamazsa, bunu aşağıdaki sırayla özel bir derleme olarak arar:

  1. assemblyName.manifest> adlı <bir bildirim dosyasının uygulama klasörünü denetleyin. Bu örnekte yükleyici, appl.exe dosyasını içeren klasörde Fabrikam.SxS.Library.manifest dosyasını bulmaya çalışır. Bildirimi bulursa, yükleyici derlemeyi uygulama klasöründen yükler. Derleme bulunamazsa yük başarısız olur.

  2. appl.exe dosyasını içeren klasörde \<assemblyName>\ klasörünü açmayı deneyin ve \<assemblyName\ varsa, bu klasörden assemblyName.manifest>> adına <sahip bir bildirim dosyası yüklemeyi deneyin. Bildirim bulunursa, yükleyici derlemeyi \<assemblyName>\ klasöründen yükler. Derleme bulunamazsa yük başarısız olur.

Yükleyicinin bağımlı derlemeleri nasıl araması hakkında daha fazla bilgi için bkz . Derleme Arama Sırası. Yükleyici bağımlı bir derlemeyi özel derleme olarak bulamazsa, yük başarısız olur ve "Sistem belirtilen programı yürütemiyor" iletisi görüntülenir. Bu hatayı çözmek için, bağımlı derlemelerin ve bunların parçası olan DLL'lerin bilgisayara özel veya paylaşılan derlemeler olarak yüklendiğinden emin olun.

Ayrıca bkz.

Yalıtılmış Uygulama ve Yan Yana Derleme Kavramları
C/C++ Yalıtılmış Uygulamaları ve Yan Yana Derlemeleri Oluşturma