Как добавить манифест сборки в исполняемый файл .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
файл в качестве моего ресурса). я перестану добавлять дополнительный объем к моему вопросу и надеюсь на ответ.
Ответы
Ответ 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 году то же самое. Правой кнопкой мыши выберите свой проект, выберите свойства и на вкладке приложения вы можете выбрать манифест. Сначала вы должны добавить его в свой проект, но вы можете сделать это легко, добавив существующий файл.