web-dev-qa-db-fra.com

Comment ajouter un manifeste Assembly à un exécutable .NET?

Comment puis-je ajouter un manifeste Assembly à mon exécutable .NET?


Un manifeste d'assembly est un fichier XML qui est ajouté à un exécutable portable .NET (PE) avec le type de ressource RT_MANIFEST (24).

Les manifestes d'assembly sont utilisés pour déclarer un certain nombre de choses sur l'exécutable, par exemple:

  • Si je souhaite désactiver la mise à l'échelle DPI parce que je suis un bon développeur:

    <!-- We are high-dpi aware on Windows Vista -->
    <asmv3:application xmlns:asmv3="urn:schemas-Microsoft-com:asm.v3">
       <asmv3:windowsSettings xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">
          <dpiAware>true</dpiAware>
       </asmv3:windowsSettings>
    </asmv3:application>
    
  • je peux déclarer que j'ai été conçu et testé sur Windows 7, et je dois continuer à dépendre de tout bogue dans Windows 7

    <!-- We were designed and tested on Windows 7 -->
    <compatibility xmlns="urn:schemas-Microsoft-com:compatibility.v1">
       <application>
          <!--The ID below indicates application support for Windows 7 -->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
       </application>
    </compatibility>
    
  • je peux déclarer que je suis un bon développeur et que je n'ai pas besoin de virtualisation de fichiers et de registres

    <!-- Disable file and registry virtualization -->
    <trustInfo xmlns="urn:schemas-Microsoft-com:asm.v2">
       <security>
          <requestedPrivileges>
             <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
          </requestedPrivileges>
       </security>
    </trustInfo>
    
  • je peux déclarer que je dépend d'une version particulière 6 de la bibliothèque Microsoft Common Controls :

    <!-- Dependency on Common Controls version 6 -->
    <dependency>
       <dependentAssembly>
          <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
       </dependentAssembly>
    </dependency>
    
  • je peux déclarer que je dépend d'une version particulière de GDI +:

    <dependency>
       <dependentAssembly>
          <assemblyIdentity type="win32" name="Microsoft.Windows.GdiPlus" version="1.0.0.0" processorArchitecture="x86"
                publicKeyToken="6595b64144ccf1df" language="*" />
       </dependentAssembly>
    </dependency>
    

Dans l'ancien temps , nous créerions un fichier de script de ressource (*.rc), par exemple.:

wumpa.rc

   1    24    AssemblyManifest.xml

ajoutez ce fichier au projet, et le compilateur compilera le .rc fichier; y compris les ressources dans l'image exécutable finale.

Sauf Visual Studio 2010 ne semble pas avoir un moyen d'ajouter un fichier de script de ressources à un projet .

Comment ajouter un script de ressource à un projet dans Visual Studio 2010?

Comment ajouter un manifeste d'assembly à un projet dans Visual Studio 2010?

Remarque : Toute solution doit fonctionner dans un environnement avec contrôle de code source et plusieurs développeurs (par exemple, des chemins codés en dur vers des fichiers binaires probablement non installés casseront la construction et non travail).

Bonus Chatter


Mise à jour : Michael Fox suggère que la boîte de dialogue des propriétés du projet puisse être utilisée pour inclure un manifeste d'assembly, mais il n'indique pas :

enter image description here


Mise à jour : Ce que j'ai essayé:

  • Dans l'écran des propriétés du projet, sélectionnez Application . Sélectionnez l'option radio Icône et manifeste . Sous Manifest laissez l'option par défaut _ Embed manifest with default settings:

enter image description here

Ne fonctionne pas car il intègre un manifeste avec les paramètres par défaut , plutôt que mes paramètres.

  • Sous Manifest , changez l'option combo en Create application without a manifest:

    enter image description here

    Ne fonctionne pas car il n'intègre aucun manifeste

  • Sous Ressources sélectionnez l'option de radio Fichier de ressources :

    enter image description here

    Ne fonctionne pas car vous ne pouvez pas sélectionner un manifeste d'assembly (ou un script de ressource qui inclut un manifeste d'assembly)

  • Sous Ressources , sélectionnez l'option de radio Fichier de ressources , puis entrez le chemin dans un fichier XML de manifeste d'assembly:

enter image description here

Ne fonctionne pas car Visual Studio s'étouffe lorsqu'il est présenté avec un manifeste Assembly:

enter image description here

  • Sous Ressources , sélectionnez l'option de radio Fichier de ressources , puis entrez le chemin dans un fichier de script de ressource:

enter image description here

Ne fonctionne pas car Visual Studio s'étouffe lorsqu'il est présenté avec un script de ressource:

enter image description here

  • Ajouter le AssemblyManifest.xml à mon projet, puis recherchez-le dans la zone de liste déroulante Manifest :

    enter image description here

    Ne fonctionne pas car le fichier Manifest d'assembly n'est pas répertorié en option

j'ai une douzaine d'autres choses que je peux garder capture d'écran (ajoutez un fichier .rc à la solution, recherchez-le dans la liste déroulante, sélectionnez "pas de manifeste" et modifiez le wumpa.rc créer une action pour diverses choses, construire le .rc fichier à l'aide d'un compilateur de ressources distinct, soit manuellement, soit à une étape de pré-génération/msbuild, et sélectionnez ce .res fichier comme ressource). je vais arrêter d'ajouter du volume à ma question et j'espère une réponse.

30
Ian Boyd

Si vous souhaitez ajouter des informations personnalisées au manifeste de votre application, vous pouvez suivre ces étapes:

  1. Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions.
  2. Cliquez sur "Ajouter un nouvel élément".
  3. Sélectionnez "Fichier manifeste d'application".

Cela ajoute un fichier nommé app.manifest à votre projet, que vous pouvez ouvrir et modifier à votre guise.


Des étapes similaires, avec des captures d'écran, sont extraites de Déclarer les applications gérées comme DPI-Aware sur MSDN:

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur votre projet, pointez sur Ajouter, puis cliquez sur Nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Fichier manifeste d'application, puis cliquez sur Ajouter. Le fichier app.manifest apparaît.

    enter image description here

  3. Copiez et collez le texte suivant dans le fichier app.manifest puis enregistrez.

    <?xml version="1.0" encoding="utf-8"?>
    <asmv1:Assembly manifestVersion="1.0" xmlns="urn:schemas-Microsoft-com:asm.v1" 
                    xmlns:asmv1="urn:schemas-Microsoft-com:asm.v1" 
                    xmlns:asmv2="urn:schemas-Microsoft-com:asm.v2" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
      <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    
        <!-- Disable file and registry virtualization. -->
        <trustInfo xmlns="urn:schemas-Microsoft-com:asm.v2">
          <security>
            <requestedPrivileges xmlns="urn:schemas-Microsoft-com:asm.v3">
             <requestedExecutionLevel level="asInvoker" uiAccess="false" />
             <!--  <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
                   <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
                   <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
             -->
            </requestedPrivileges>
          </security>
        </trustInfo>
    
        <!-- We are high-dpi aware on Windows Vista -->
        <asmv3:application xmlns:asmv3="urn:schemas-Microsoft-com:asm.v3">
          <asmv3:windowsSettings xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
          </asmv3:windowsSettings>
        </asmv3:application>
    
        <!-- Declare that we were designed to work with Windows Vista and Windows 7-->
        <compatibility xmlns="urn:schemas-Microsoft-com:compatibility.v1">
          <application>
            <!--The ID below indicates application support for Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <!--The ID below indicates application support for Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
          </application>
        </compatibility>
    
        <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
        <dependency>
          <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
          </dependentAssembly>
        </dependency>
    
      </asmv1:Assembly>
    
  4. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis cliquez sur Propriétés pour vérifier que le app.manifest est utilisé.

    enter image description here

  5. Votre application est maintenant manifestée comme devant être "conçue pour Windows" et est

    • désactive la virtualisation des fichiers et du registre
    • désactive la mise à l'échelle DWM des applications
    • annonce que vous avez été conçu et testé sur Windows 7 et Windows Vista
    • prend une dépendance sur la bibliothèque de contrôles communs version 6 (permettant l'utilisation de styles visuels par les contrôles communs)
26
Cody Gray

J'ai Visual Studio 2010 Professional avec Service Pack 1 installé. J'utilise Windows 7 Ultimate 64 bits. Si je suis ces instructions, les propriétés du projet affichent "Incorporer le manifeste avec les paramètres par défaut" dans le bloc de ressources, et l'option est également désactivée! Lorsque je crée, le manifeste n'est pas intégré dans le DLL comme je l'ai vérifié en ouvrant le DLL dans la vue des ressources).

Cependant, si je:

  1. Recherchez le fichier app.manifest ajouté dans l'Explorateur de solutions
  2. Faites un clic droit et choisissez Propriétés
  3. Modifiez la propriété Build Action de "None" à "Embedded Resource"
  4. Reconstruire

Le fichier manifeste est incorporé correctement, ce que je peux vérifier en chargeant le DLL dans la vue des ressources. Le paramètre Manifest dans les propriétés de l'application apparaît toujours comme "Intégrer le manifeste avec les paramètres par défaut" et est toujours désactivé .

6
Mozzis

Dans Visual Studio 2008, cela peut être fait dans la fenêtre Propriétés du projet. Je suis presque certain que c'est la même chose en 2010. Faites un clic droit sur votre projet, sélectionnez les propriétés et dans l'onglet application, vous pouvez sélectionner un manifeste. Vous devez d'abord l'ajouter à votre projet, mais vous pouvez le faire facilement en ajoutant un fichier existant.

2
Michael Fox