Как добавить манифест сборки в исполняемый файл .NET? - PullRequest
30 голосов
/ 15 ноября 2011

Как добавить манифест сборки в мой исполняемый файл .NET?


Манифест сборки - это файл XML, который добавляется в переносимый исполняемый файл .NET с типом ресурса RT_MANIFEST (24).

Манифесты сборки используются для объявления некоторых вещей об исполняемом файле, например ::

  • Если я хочу отключить масштабирование DPI, потому что я хороший разработчик:

    <!-- 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>
    
  • Я могу заявить, что я был спроектирован и протестирован на Windows 7, и я должен продолжать зависеть от любых ошибок в 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>
    
  • Я могу заявить, что я хороший разработчик и мне не нужна виртуализация файлов и реестра

    <!-- Disable file and registry virtualization -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
       <security>
          <requestedPrivileges>
             <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
          </requestedPrivileges>
       </security>
    </trustInfo>
    
  • Я могу заявить, что я зависим от конкретной версии 6 библиотеки 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>
    
  • Я могу заявить, что я зависим от конкретной версии GDI +:

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

В прежние времена мы создавали бы файл сценария ресурса файл (*.rc), например ::

wumpa.rc

   1    24    AssemblyManifest.xml

добавьте этот файл в проект, и компилятор скомпилирует файл .rc; включая ресурсы в окончательный исполняемый образ.

За исключением В Visual Studio 2010, похоже, нет способа добавить файл сценария ресурса в проект .

Как добавить скрипт ресурса в проект в Visual Studio 2010?

Как добавить манифест сборки в проект в Visual Studio 2010?

Примечание : Любое решение должно работать в среде с контролем версий и несколькими разработчиками (например, жестко заданные пути к, вероятно, не установленным двоичным файлам нарушат сборку и не будут работать).

Бонусная болтовня


Обновление : Майкл Фокс предлагает использовать диалоговое окно свойств проекта для включения манифеста сборки, но он не указывает , где :

enter image description here


Обновление : Вещи, которые я пробовал:

  • На экране свойств проекта выберите Приложение . Выберите опцию радио Значок и манифест . Под Manifest оставьте значение по умолчанию Embed manifest with default settings:

enter image description here

Не работает, поскольку он встраивает манифест с настройками по умолчанию , а не с моими настройками.

  • Под Манифест , измените опцию комбо на Create application without a manifest:

    enter image description here

    Не работает, потому что не содержит манифеста

  • Под Ресурсы выберите опцию Файл ресурсов радио:

    enter image description here

    Не работает, потому что вы не можете выбрать манифест сборки (или скрипт ресурса, который включает манифест сборки)

  • В разделе Ресурсы выберите параметр радиосвязи Файл ресурсов , затем введите путь к XML-файлу манифеста сборки:

enter image description here

Не работает, потому что Visual Studio задыхается при представлении с манифестом сборки :

enter image description here

  • В разделе Ресурсы , выберите опцию Файл ресурсов , а затем введите путь к файлу сценария ресурса:

enter image description here

Не работает, потому что Visual Studio задыхается при представлении со сценарием ресурса :

enter image description here

  • Добавьте AssemblyManifest.xml в мой проект, а затем найдите его в поле Manifest :

    enter image description here

    Не работает, поскольку файл манифеста сборки не указан в качестве опции

У меня есть дюжина других вещей, которые я могу продолжать снимать скриншоты (добавьте файл .rc к решению, найдите его в раскрывающемся списке, выберите «no manifest» и измените действие сборки wumpa.rc на различные вещи, соберите .rc файл, используя отдельный компилятор ресурсов, либо вручную, либо на этапе предварительной сборки / msbuild, и выберите этот .res файл в качестве моего ресурса).я перестану добавлять дополнительные вопросы к моему вопросу и надеюсь на ответ.

Ответы [ 3 ]

26 голосов
/ 13 января 2012

Если вы хотите добавить пользовательскую информацию в манифест вашего приложения, вы можете выполнить следующие действия:

  1. Щелкните правой кнопкой мыши проект в обозревателе решений.
  2. Нажмите «Добавить новый предмет».
  3. Выберите «Файл манифеста приложения».

Это добавляет файл с именем app.manifest в ваш проект, который вы можете открывать и изменять по своему усмотрению.


Аналогичные шаги со снимками экрана, снятыми с Объявление управляемых приложений как DPI-Aware на MSDN:

  1. В обозревателе решений щелкните правой кнопкой мыши свой проект, укажите Добавить , а затем нажмите Новый элемент .

  2. В диалоговом окне Добавить новый элемент выберите Файл манифеста приложения , а затем нажмите Добавить . Появится файл app.manifest.

    enter image description here

  3. Скопируйте и вставьте следующий текст в файл app.manifest , а затем сохраните.

    <?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. В обозревателе решений щелкните правой кнопкой мыши проект и выберите Свойства , чтобы убедиться, что используется app.manifest .

    enter image description here

  5. Ваше приложение теперь отображается как «предназначенное для Windows» и имеет значение

    • отключает виртуализацию файлов и реестра
    • отключает масштабирование приложений в DWM
    • объявляет, что вы были разработаны и протестированы для Windows 7 и Windows Vista
    • зависит от библиотеки Common Controls версии 6 (что позволяет использовать визуальные стили общими элементами управления)
6 голосов
/ 02 августа 2012

У меня установлена ​​Visual Studio 2010 Professional с пакетом обновления 1 (SP1).Я использую 64-разрядную версию Windows 7 Ultimate.Если я буду следовать этим инструкциям, свойства проекта покажут «Встраивать манифест с настройками по умолчанию» в блоке ресурсов, а также эта опция отключена!При сборке манифест не внедряется в DLL, как я проверял, открывая DLL в представлении ресурсов.

Однако, если я:

  1. Найдите добавленный app.manifestфайл в обозревателе решений
  2. Щелкните правой кнопкой мыши и выберите «Свойства»
  3. Измените свойство «Построить действие» с «Нет» на «Встроенный ресурс»
  4. Перестроить

Файл манифеста встроен правильно, что я могу проверить, загрузив DLL в представление ресурсов.Параметр «Манифест» в свойствах приложения по-прежнему отображается как «Встроить манифест с настройками по умолчанию» и по-прежнему отключен.

2 голосов
/ 15 ноября 2011

В Visual Studio 2008 это можно сделать в окне «Свойства проекта». Я почти уверен, что то же самое в 2010 году. Щелкните правой кнопкой мыши на своем проекте, выберите свойства, и на вкладке приложения вы можете выбрать манифест. Сначала вы должны добавить его в свой проект, но это легко сделать, добавив существующий файл.

...