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

Как добавить манифест сборки в мой исполняемый файл.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?

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

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


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


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

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

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

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

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

  • Под Ресурсами выберите опцию Resource File:

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

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

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

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

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

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

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

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

3 ответа

Решение

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

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

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


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

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

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

  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.

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

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

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

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

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

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

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

Другие вопросы по тегам