Doppelte Einträge in der .manifest Datei



  • hallo!

    erstmal vieleicht ein paar details zu meiner anwendung:
    sie besteht aus einem hauptprojekt, welches als .exe erstellt wird.
    dazu gesellen sich einige projekte, die von dem hauptprojekt genutzt werden (im quellcode über #include "datei.h" und die anschl. klassenaufrufe etc...). diese projekte werden als .dll erstellt.
    als letztes kommt noch ein projekt, welches als .lib erstellt wird und wiederum vom hauptprojekt genutzt wird.

    zu meiner frage:

    die manifestdatei, die mir VS2005 für meine app. rausschreibt ist etwas merkwürdig:
    (datei: "hauptanwendung.intermediate.manifest". manifest ist eingebettet)

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type='win32' name='Microsoft.VC80.MFC' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
    </assembly>
    

    der "Microsoft.VC80.CRT" eintrag ist zwei mal drin, mit unterschiedlichen versionen, während bei einfachen testanwendungen, die ich anlegte um zu vergleichen und bei den DLL projekten dieser anwendung nur die ersten beiden einträge für die CRT und MFC mit der version "8.0.50727.762" rausgeschrieben werden.

    mich würde interessieren warum dieser eintrag zusätzlich rausgeschrieben wird? woran kann man das evtl. nachvollziehen? ich habe mich in den letzten tagen recht intensiv mit dem thema manifest auseinenadergesetzt, stichwort "private assemblies", deswegen ist mir das aufgefallen.

    danke schon mal für eure antworten!


  • Mod

    2 Möglichkeiten.

    1. Du verwendest _USE_RTM_VERSION inkonsequent.
    D.h. mal hast Du es definiert und mal nicht.

    Grunsätzlich solltest Du diesen define gar nicht verwenden. Microsoft hat diesen #define auch schon bedauert, weil nicht stimmt was er einem vorgaukelt.
    Es wird immer die neueste CRT Version geladen, die installiert ist und nicht verhindert das SP1 genutzt wird.

    Lass den define weg!

    2. Es könnte sein, du verwendest eine Library die nicht mit VC2005 SP1 kompiliert wurde sondern nur mit VC2005 ohne SP1!
    Auch dann ist das klar. Die entsprechende Lib emmmitiert diese alten Assmebly Anforderungen.

    Siehe auch mein Artikel:
    http://blog.m-ri.de/index.php/2007/06/04/_mfc_noforce_manifest-und-_atl_noforce_manifest/
    http://blog.m-ri.de/index.php/2007/03/22/warum-man-seine-libraries-mit-_crt_noforce_manifest-erzeugen-sollte/

    Und auch
    http://www.codeproject.com/cpp/PrivateAssemblyProjects.asp



  • oh, danke für die flotte antwort!

    punkt 1.

    ich habe vorsichtshalber in der ganzen projekmappe nach "_USE_RTM_VERSION" gesucht und es wurde nicht entdeckt. ich gehe davon aus, dass punkt 1 damit enfällt.

    was punkt 2 angeht:
    dieses projekt wurde von VC6 nach VC8 portiert, könnte evtl damit zusammenhängen.
    bin am prüfen.



  • Martin Richter schrieb:

    Und auch
    http://www.codeproject.com/cpp/PrivateAssemblyProjects.asp

    das war einer der ersten beiträge die ich damals auf meiner suche nach "private assemblies" gelesen habe 🙂

    allerdings hat mir diese lösung folgende manifestdatei rausgeschrieben:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.VC80.MFC" version="8.0.50727.762" processorArchitecture="x86"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly>
    

    also die "automatisch" erzeugten einträge, die auch in meinen ersten eintrag zu sehen sind plus die (gewünschten) einträge, erstellt durch die hinzugefügte "UseMSPrivateAssemblies.h" headerdatei.

    edit: die headerdatei war mit include an der ersten stelle in der stdafx.h eingefügt.


  • Mod

    Dann existiert irgendwo eine Objektdatei, die gezogen wird und die nicht mit den entsprechenden Einstellugen kompiliert wurde.

    Durchsuche mal die Objektdateien. Das Pragma steht da als Klartext drin!



  • Martin Richter schrieb:

    Dann existiert irgendwo eine Objektdatei, die gezogen wird und die nicht mit den entsprechenden Einstellugen kompiliert wurde.

    Durchsuche mal die Objektdateien. Das Pragma steht da als Klartext drin!

    meinst du ein pragma mit so einem, bzw. so ähnlichen inhalt:

    #pragma comment(linker,"/manifestdependency:\"type='win32' "						\
    	"name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX "." __LIBRARIES_SUB_VERSION "CRT' "   \
    	"version='" _CRT_ASSEMBLY_VERSION "' "											\
    	"processorArchitecture='x86' \"")
    

    kannst du bitte etwas näher auf die "entsprechenden Einstellugen" eingehen?



  • ich habe jetzt alle *.obj durchsuchen lassen, die zum projekt gehören:

    2 einträge wurden gefunden:

    1. im debug ordner eines dll projekts in der stdafx.obj: BINDF_PRAGMA_NO_CACHE
    2. im release order des exe hauptprojekts in der stdafx: <vc_attributes>::pragmaAttribute

  • Mod

    Nein! Es geht um den Text des pragmas "/manifestdependency: ..."



  • ah, ok!
    hab jetzt in den .obj dateien nach dem stichwort "manifestdependency" gesucht und auf anhieb knapp 600 einträge gefunden. ich habe mir vereinzelt einige dateien angeschaut und immer nur die 2 einträge für die CRT und MFC gefunden mit den neuesten versionen (8.0.50727.762).

    da ich mir nicht alle gut 300 dateien angucken wollte hab ich nochmal die suche angestossen, diesmal nach dem string "8.0.50608.0", also der alten version in dem dritten CRT eintrag im manifest. das ergebnis blieb aber erfolglos. ich hab die suche vorsichtshalber nach dem string "8.0.50727.762" logeschickt, ob die versionsnummer gefunden wird und da wurden alle einträge gefunden, sprich in den .obj dateien sind keine einträge mit der alten versionnummer drin.



  • Di wirst vermutlich auf *Deinem* Rechner _nicht_ das SP1 von VS2005 installiert haben!
    Auch solltest Du die von Hand hinzugefügten letzten beiden Einträge entfernen!



  • Jochen Kalmbach schrieb:

    Di wirst vermutlich auf *Deinem* Rechner _nicht_ das SP1 von VS2005 installiert haben!
    Auch solltest Du die von Hand hinzugefügten letzten beiden Einträge entfernen!

    hallo jochen!

    doch: das "Microsoft Visual Studio 2005 Professional Edition - DEU Service Pack 1 (KB926606)" ist drauf.

    die beiden "assemblyIdentity" einträge die du meinst (denke ich) wurden durch den code des eingefügten header ("UseMSPrivateAssemblies.h") hinzugefügt.

    die manifestdatei, die ich nutze ist von mir angepasst und nur besteht nur aus den ersten beiden einträgen, also:
    "Microsoft.VC80.CRT" version="8.0.50727.762" und
    "Microsoft.VC80.MFC" version="8.0.50727.762"

    und das programm läuft.

    meine frage ist halt, wieso noch ein dritter eintrag mit der alten versionsnummer rausgeschrieben wird?

    ich habe mir gerade auch zusätzlich meine .exe mit dem dependency walker und process explorer angeschaut und auch keine hinweise auf eine abhängigkeit von dateien mit dieser versionsnummer gefunden.

    interessanterweise fehlt mir laut Dep.Walker eine DWMAPI.DLL bzw. sie kann nicht geladen werden. auf meinem rechner ist sie auch nicht zu finden.

    fragen über fragen.... 🙂


Anmelden zum Antworten