Подтвердить что ты не робот

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

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


манифест сборки - это XML файл, который добавляется к исполняемому файлу .NET(PE) с типом ресурса 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>
    

В старые времена мы создали бы ресурс script (*.rc), например:

wumpa.rc

   1    24    AssemblyManifest.xml

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

За исключением Visual Studio 2010, похоже, не имеет возможности добавить ресурс script к проекту.

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

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

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

Бонус-чат


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

enter image description here


Обновить: все, что я пробовал:

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

введите описание изображения здесь

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

  • В Манифест измените параметр комбо для Create application without a manifest:

    enter image description here

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

  • В разделе Ресурсы выберите параметр Файл ресурсов:

    enter image description here

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

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

введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

Не работает, потому что Visual Studio задыхается, когда отображается ресурс script:

введите описание изображения здесь

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

    enter image description here

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

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

4b9b3361

Ответ 1

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

  • Щелкните правой кнопкой мыши проект в обозревателе решений.
  • Нажмите "Добавить новый элемент".
  • Выберите "Файл манифеста приложений".

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


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

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

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

    enter image description here

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

    enter image description here

  • Ваше приложение теперь проявляется, как требуется, для "созданного для Windows" и

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

Ответ 2

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

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

  • Найдите добавленный файл app.manifest в обозревателе решений
  • Щелкните правой кнопкой мыши и выберите "Свойства"
  • Измените свойство Build Action на "None" на "Embedded Resource"
  • Перестроить

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

Ответ 3

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